about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.dependabot/config.yml28
-rw-r--r--.github/dependabot.yml22
-rw-r--r--Gemfile10
-rw-r--r--Gemfile.lock58
-rw-r--r--SECURITY.md12
-rw-r--r--app/controllers/accounts_controller.rb6
-rw-r--r--app/controllers/activitypub/claims_controller.rb21
-rw-r--r--app/controllers/activitypub/collections_controller.rb48
-rw-r--r--app/controllers/admin/custom_emojis_controller.rb2
-rw-r--r--app/controllers/api/v1/crypto/deliveries_controller.rb30
-rw-r--r--app/controllers/api/v1/crypto/encrypted_messages_controller.rb59
-rw-r--r--app/controllers/api/v1/crypto/keys/claims_controller.rb25
-rw-r--r--app/controllers/api/v1/crypto/keys/counts_controller.rb17
-rw-r--r--app/controllers/api/v1/crypto/keys/queries_controller.rb26
-rw-r--r--app/controllers/api/v1/crypto/keys/uploads_controller.rb29
-rw-r--r--app/controllers/auth/sessions_controller.rb52
-rw-r--r--app/controllers/concerns/sign_in_token_authentication_concern.rb50
-rw-r--r--app/controllers/concerns/two_factor_authentication_concern.rb48
-rw-r--r--app/controllers/settings/migration/redirects_controller.rb2
-rw-r--r--app/controllers/statuses_controller.rb2
-rw-r--r--app/controllers/tags_controller.rb4
-rw-r--r--app/helpers/application_helper.rb5
-rw-r--r--app/helpers/webfinger_helper.rb19
-rw-r--r--app/javascript/mastodon/actions/importer/normalizer.js2
-rw-r--r--app/javascript/mastodon/components/autosuggest_textarea.js2
-rw-r--r--app/javascript/mastodon/components/status.js1
-rw-r--r--app/javascript/mastodon/features/emoji/__tests__/emoji-test.js2
-rw-r--r--app/javascript/mastodon/features/emoji/emoji.js11
-rw-r--r--app/javascript/mastodon/features/status/components/card.js85
-rw-r--r--app/javascript/mastodon/features/status/components/detailed_status.js2
-rw-r--r--app/javascript/mastodon/locales/en.json28
-rw-r--r--app/javascript/styles/mastodon-light/variables.scss2
-rw-r--r--app/javascript/styles/mastodon/accessibility.scss11
-rw-r--r--app/javascript/styles/mastodon/components.scss26
-rw-r--r--app/lib/activitypub/activity/create.rb50
-rw-r--r--app/lib/activitypub/adapter.rb1
-rw-r--r--app/lib/feed_manager.rb11
-rw-r--r--app/lib/inline_renderer.rb2
-rw-r--r--app/mailers/user_mailer.rb17
-rw-r--r--app/models/account.rb1
-rw-r--r--app/models/concerns/account_associations.rb1
-rw-r--r--app/models/device.rb35
-rw-r--r--app/models/encrypted_message.rb50
-rw-r--r--app/models/message_franking.rb19
-rw-r--r--app/models/one_time_key.rb21
-rw-r--r--app/models/preview_card.rb9
-rw-r--r--app/models/system_key.rb41
-rw-r--r--app/models/user.rb28
-rw-r--r--app/presenters/activitypub/activity_presenter.rb41
-rw-r--r--app/presenters/initial_state_presenter.rb2
-rw-r--r--app/serializers/activitypub/activity_serializer.rb54
-rw-r--r--app/serializers/activitypub/actor_serializer.rb9
-rw-r--r--app/serializers/activitypub/collection_serializer.rb24
-rw-r--r--app/serializers/activitypub/device_serializer.rb52
-rw-r--r--app/serializers/activitypub/encrypted_message_serializer.rb61
-rw-r--r--app/serializers/activitypub/one_time_key_serializer.rb35
-rw-r--r--app/serializers/activitypub/outbox_serializer.rb11
-rw-r--r--app/serializers/activitypub/undo_announce_serializer.rb6
-rw-r--r--app/serializers/initial_state_serializer.rb2
-rw-r--r--app/serializers/rest/encrypted_message_serializer.rb19
-rw-r--r--app/serializers/rest/keys/claim_result_serializer.rb9
-rw-r--r--app/serializers/rest/keys/device_serializer.rb6
-rw-r--r--app/serializers/rest/keys/query_result_serializer.rb11
-rw-r--r--app/serializers/rest/preview_card_serializer.rb2
-rw-r--r--app/services/activitypub/process_account_service.rb1
-rw-r--r--app/services/backup_service.rb2
-rw-r--r--app/services/block_domain_service.rb53
-rw-r--r--app/services/clear_domain_media_service.rb70
-rw-r--r--app/services/concerns/payloadable.rb3
-rw-r--r--app/services/deliver_to_device_service.rb78
-rw-r--r--app/services/import_service.rb4
-rw-r--r--app/services/keys/claim_service.rb77
-rw-r--r--app/services/keys/query_service.rb75
-rw-r--r--app/services/process_mentions_service.rb2
-rw-r--r--app/services/reblog_service.rb2
-rw-r--r--app/services/resolve_account_service.rb2
-rw-r--r--app/validators/ed25519_key_validator.rb19
-rw-r--r--app/validators/ed25519_signature_validator.rb29
-rw-r--r--app/views/about/more.html.haml3
-rw-r--r--app/views/admin/custom_emojis/index.html.haml10
-rw-r--r--app/views/admin/instances/index.html.haml12
-rw-r--r--app/views/auth/sessions/sign_in_token.html.haml14
-rw-r--r--app/views/statuses/_detailed_status.html.haml2
-rw-r--r--app/views/statuses/_simple_status.html.haml2
-rw-r--r--app/views/user_mailer/sign_in_token.html.haml105
-rw-r--r--app/views/user_mailer/sign_in_token.text.erb17
-rw-r--r--app/workers/activitypub/distribution_worker.rb2
-rw-r--r--app/workers/activitypub/reply_distribution_worker.rb2
-rw-r--r--app/workers/domain_block_worker.rb7
-rw-r--r--app/workers/domain_clear_media_worker.rb14
-rw-r--r--app/workers/import/relationship_worker.rb21
-rw-r--r--app/workers/push_conversation_worker.rb3
-rw-r--r--app/workers/push_encrypted_message_worker.rb16
-rw-r--r--app/workers/scheduler/doorkeeper_cleanup_scheduler.rb1
-rw-r--r--config/brakeman.ignore228
-rw-r--r--config/initializers/doorkeeper.rb3
-rw-r--r--config/initializers/inflections.rb1
-rw-r--r--config/locales/en.yml22
-rw-r--r--config/locales/simple_form.en.yml1
-rw-r--r--config/routes.rb18
-rw-r--r--config/webpack/shared.js10
-rw-r--r--db/migrate/20170129000348_create_devices.rb13
-rw-r--r--db/migrate/20170205175257_remove_devices.rb2
-rw-r--r--db/migrate/20200516180352_create_devices.rb14
-rw-r--r--db/migrate/20200516183822_create_one_time_keys.rb12
-rw-r--r--db/migrate/20200518083523_create_encrypted_messages.rb15
-rw-r--r--db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb13
-rw-r--r--db/migrate/20200529214050_add_devices_url_to_accounts.rb5
-rw-r--r--db/migrate/20200601222558_create_system_keys.rb9
-rw-r--r--db/migrate/20200605155027_add_blurhash_to_preview_cards.rb5
-rw-r--r--db/migrate/20200608113046_add_sign_in_token_to_users.rb6
-rw-r--r--db/schema.rb55
-rw-r--r--lib/paperclip/blurhash_transcoder.rb2
-rw-r--r--lib/tasks/emojis.rake44
-rw-r--r--lib/tasks/mastodon.rake7
-rw-r--r--package.json26
-rw-r--r--public/emoji/1f327_border.svg9
-rw-r--r--public/emoji/1f328_border.svg9
-rw-r--r--public/emoji/1f329_border.svg9
-rw-r--r--public/emoji/1f359_border.svg11
-rw-r--r--public/emoji/1f35a_border.svg13
-rw-r--r--public/emoji/1f365_border.svg9
-rw-r--r--public/emoji/1f373_border.svg13
-rw-r--r--public/emoji/1f393_border.svg19
-rw-r--r--public/emoji/1f3a4_border.svg11
-rw-r--r--public/emoji/1f3a5_border.svg21
-rw-r--r--public/emoji/1f3a9_border.svg11
-rw-r--r--public/emoji/1f3ae_border.svg35
-rw-r--r--public/emoji/1f3b1_border.svg11
-rw-r--r--public/emoji/1f3b3_border.svg21
-rw-r--r--public/emoji/1f3bc_border.svg9
-rw-r--r--public/emoji/1f3d0_border.svg9
-rw-r--r--public/emoji/1f3f3_border.svg15
-rw-r--r--public/emoji/1f3f4_border.svg15
-rw-r--r--public/emoji/1f403_border.svg11
-rw-r--r--public/emoji/1f40f_border.svg23
-rw-r--r--public/emoji/1f410_border.svg15
-rw-r--r--public/emoji/1f411_border.svg13
-rw-r--r--public/emoji/1f413_border.svg13
-rw-r--r--public/emoji/1f414_border.svg19
-rw-r--r--public/emoji/1f41c_border.svg11
-rw-r--r--public/emoji/1f440_border.svg25
-rw-r--r--public/emoji/1f464_border.svg7
-rw-r--r--public/emoji/1f465_border.svg9
-rw-r--r--public/emoji/1f47b_border.svg15
-rw-r--r--public/emoji/1f47d_border.svg9
-rw-r--r--public/emoji/1f480_border.svg13
-rw-r--r--public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fb_border.svg31
-rw-r--r--public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fc_border.svg31
-rw-r--r--public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fd_border.svg31
-rw-r--r--public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fe_border.svg31
-rw-r--r--public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3ff_border.svg31
-rw-r--r--public/emoji/1f482-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482_border.svg31
-rw-r--r--public/emoji/1f4a3_border.svg15
-rw-r--r--public/emoji/1f4a8_border.svg7
-rw-r--r--public/emoji/1f4ac_border.svg13
-rw-r--r--public/emoji/1f4ad_border.svg9
-rw-r--r--public/emoji/1f4b1_border.svg9
-rw-r--r--public/emoji/1f4b2_border.svg7
-rw-r--r--public/emoji/1f4c3_border.svg11
-rw-r--r--public/emoji/1f4de_border.svg7
-rw-r--r--public/emoji/1f4f7_border.svg19
-rw-r--r--public/emoji/1f4f8_border.svg19
-rw-r--r--public/emoji/1f4f9_border.svg9
-rw-r--r--public/emoji/1f4fc_border.svg23
-rw-r--r--public/emoji/1f4fd_border.svg13
-rw-r--r--public/emoji/1f507_border.svg11
-rw-r--r--public/emoji/1f508_border.svg9
-rw-r--r--public/emoji/1f509_border.svg11
-rw-r--r--public/emoji/1f50a_border.svg15
-rw-r--r--public/emoji/1f50c_border.svg9
-rw-r--r--public/emoji/1f519_border.svg7
-rw-r--r--public/emoji/1f51a_border.svg7
-rw-r--r--public/emoji/1f51b_border.svg7
-rw-r--r--public/emoji/1f51c_border.svg7
-rw-r--r--public/emoji/1f51d_border.svg7
-rw-r--r--public/emoji/1f52a_border.svg15
-rw-r--r--public/emoji/1f54a_border.svg15
-rw-r--r--public/emoji/1f54b_border.svg19
-rw-r--r--public/emoji/1f573_border.svg11
-rw-r--r--public/emoji/1f576_border.svg7
-rw-r--r--public/emoji/1f577_border.svg25
-rw-r--r--public/emoji/1f579_border.svg19
-rw-r--r--public/emoji/1f58a_border.svg17
-rw-r--r--public/emoji/1f58b_border.svg13
-rw-r--r--public/emoji/1f5a4_border.svg7
-rw-r--r--public/emoji/1f5e3_border.svg9
-rw-r--r--public/emoji/1f983_border.svg19
-rw-r--r--public/emoji/1f98d_border.svg23
-rw-r--r--public/emoji/2122_border.svg7
-rw-r--r--public/emoji/25aa_border.svg7
-rw-r--r--public/emoji/25ab_border.svg7
-rw-r--r--public/emoji/25fb_border.svg7
-rw-r--r--public/emoji/25fc_border.svg7
-rw-r--r--public/emoji/25fd_border.svg7
-rw-r--r--public/emoji/25fe_border.svg7
-rw-r--r--public/emoji/2601_border.svg9
-rw-r--r--public/emoji/2620_border.svg13
-rw-r--r--public/emoji/2660_border.svg7
-rw-r--r--public/emoji/2663_border.svg7
-rw-r--r--public/emoji/26aa_border.svg7
-rw-r--r--public/emoji/26ab_border.svg7
-rw-r--r--public/emoji/26be_border.svg11
-rw-r--r--public/emoji/26f8_border.svg15
-rw-r--r--public/emoji/2712_border.svg13
-rw-r--r--public/emoji/2714_border.svg7
-rw-r--r--public/emoji/2716_border.svg7
-rw-r--r--public/emoji/2734_border.svg7
-rw-r--r--public/emoji/2754_border.svg9
-rw-r--r--public/emoji/2755_border.svg9
-rw-r--r--public/emoji/2795_border.svg7
-rw-r--r--public/emoji/2796_border.svg7
-rw-r--r--public/emoji/2797_border.svg11
-rw-r--r--public/emoji/27b0_border.svg7
-rw-r--r--public/emoji/2b1b_border.svg7
-rw-r--r--public/emoji/2b1c_border.svg7
-rw-r--r--public/emoji/3030_border.svg7
-rw-r--r--spec/controllers/activitypub/replies_controller_spec.rb17
-rw-r--r--spec/controllers/auth/sessions_controller_spec.rb66
-rw-r--r--spec/fabricators/device_fabricator.rb8
-rw-r--r--spec/fabricators/encrypted_message_fabricator.rb8
-rw-r--r--spec/fabricators/one_time_key_fabricator.rb11
-rw-r--r--spec/fabricators/system_key_fabricator.rb3
-rw-r--r--spec/lib/activitypub/activity/create_spec.rb56
-rw-r--r--spec/mailers/previews/user_mailer_preview.rb5
-rw-r--r--spec/models/device_spec.rb5
-rw-r--r--spec/models/encrypted_message_spec.rb5
-rw-r--r--spec/models/one_time_key_spec.rb5
-rw-r--r--spec/models/system_key_spec.rb5
-rw-r--r--spec/services/clear_domain_media_service_spec.rb23
-rw-r--r--spec/workers/domain_block_worker_spec.rb4
-rw-r--r--spec/workers/domain_clear_media_worker_spec.rb26
-rw-r--r--streaming/index.js65
-rw-r--r--yarn.lock1926
246 files changed, 5035 insertions, 1362 deletions
diff --git a/.dependabot/config.yml b/.dependabot/config.yml
deleted file mode 100644
index 06df775c2..000000000
--- a/.dependabot/config.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-version: 1
-
-update_configs:
-  - package_manager: "ruby:bundler"
-    directory: "/"
-    update_schedule: "weekly"
-    # Supported update schedule: live daily weekly monthly
-    version_requirement_updates: "auto"
-    # Supported version requirements: auto widen_ranges increase_versions increase_versions_if_necessary
-    allowed_updates:
-      - match:
-          dependency_type: "all"
-          # Supported dependency types: all indirect direct production development
-          update_type: "all"
-          # Supported update types: all security
-
-  - package_manager: "javascript"
-    directory: "/"
-    update_schedule: "weekly"
-    # Supported update schedule: live daily weekly monthly
-    version_requirement_updates: "auto"
-    # Supported version requirements: auto widen_ranges increase_versions increase_versions_if_necessary
-    allowed_updates:
-      - match:
-          dependency_type: "all"
-          # Supported dependency types: all indirect direct production development
-          update_type: "all"
-          # Supported update types: all security
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..6b47350a4
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,22 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+  - package-ecosystem: npm
+    directory: "/"
+    schedule:
+      interval: weekly
+    open-pull-requests-limit: 99
+    allow:
+      - dependency-type: all
+
+  - package-ecosystem: bundler
+    directory: "/"
+    schedule:
+      interval: weekly
+    open-pull-requests-limit: 99
+    allow:
+      - dependency-type: all
diff --git a/Gemfile b/Gemfile
index 01e35caa7..fb760059e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -20,7 +20,7 @@ gem 'makara', '~> 0.4'
 gem 'pghero', '~> 2.5'
 gem 'dotenv-rails', '~> 2.7'
 
-gem 'aws-sdk-s3', '~> 1.66', require: false
+gem 'aws-sdk-s3', '~> 1.67', require: false
 gem 'fog-core', '<= 2.1.0'
 gem 'fog-openstack', '~> 0.3', require: false
 gem 'paperclip', '~> 6.0'
@@ -50,6 +50,7 @@ gem 'omniauth', '~> 1.9'
 
 gem 'discard', '~> 1.2'
 gem 'doorkeeper', '~> 5.4'
+gem 'ed25519', '~> 1.2'
 gem 'fast_blank', '~> 1.0'
 gem 'fastimage'
 gem 'goldfinger', '~> 2.1'
@@ -83,7 +84,7 @@ gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis']
 gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
 gem 'rqrcode', '~> 1.1'
 gem 'ruby-progressbar', '~> 1.10'
-gem 'sanitize', '~> 5.1'
+gem 'sanitize', '~> 5.2'
 gem 'sidekiq', '~> 6.0'
 gem 'sidekiq-scheduler', '~> 3.0'
 gem 'sidekiq-unique-jobs', '~> 6.0'
@@ -93,7 +94,6 @@ gem 'simple_form', '~> 5.0'
 gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
 gem 'stoplight', '~> 2.2.0'
 gem 'strong_migrations', '~> 0.6'
-gem 'tty-command', '~> 0.9', require: false
 gem 'tty-prompt', '~> 0.21', require: false
 gem 'twitter-text', '~> 1.14'
 gem 'tzinfo-data', '~> 1.2020'
@@ -122,7 +122,7 @@ end
 group :test do
   gem 'capybara', '~> 3.32'
   gem 'climate_control', '~> 0.2'
-  gem 'faker', '~> 2.11'
+  gem 'faker', '~> 2.12'
   gem 'microformats', '~> 4.2'
   gem 'rails-controller-testing', '~> 1.0'
   gem 'rspec-sidekiq', '~> 3.0'
@@ -141,7 +141,7 @@ group :development do
   gem 'letter_opener', '~> 1.7'
   gem 'letter_opener_web', '~> 1.4'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 0.84', require: false
+  gem 'rubocop', '~> 0.85', require: false
   gem 'rubocop-rails', '~> 2.5', require: false
   gem 'brakeman', '~> 4.8', require: false
   gem 'bundler-audit', '~> 0.6', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 111bdabcd..e4900dc68 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -92,20 +92,20 @@ GEM
     av (0.9.0)
       cocaine (~> 0.5.3)
     aws-eventstream (1.1.0)
-    aws-partitions (1.320.0)
-    aws-sdk-core (3.96.1)
+    aws-partitions (1.326.0)
+    aws-sdk-core (3.98.0)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
       aws-sigv4 (~> 1.1)
       jmespath (~> 1.0)
-    aws-sdk-kms (1.31.0)
+    aws-sdk-kms (1.33.0)
       aws-sdk-core (~> 3, >= 3.71.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.66.0)
+    aws-sdk-s3 (1.67.1)
       aws-sdk-core (~> 3, >= 3.96.1)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.1)
-    aws-sigv4 (1.1.3)
+    aws-sigv4 (1.1.4)
       aws-eventstream (~> 1.0, >= 1.0.2)
     bcrypt (3.1.13)
     better_errors (2.7.1)
@@ -119,7 +119,7 @@ GEM
     bootsnap (1.4.6)
       msgpack (~> 1.0)
     brakeman (4.8.2)
-    browser (4.1.0)
+    browser (4.2.0)
     builder (3.2.4)
     bullet (6.1.0)
       activesupport (>= 3.0.0)
@@ -164,9 +164,9 @@ GEM
     climate_control (0.2.0)
     cocaine (0.5.8)
       climate_control (>= 0.0.3, < 1.0)
-    coderay (1.1.2)
+    coderay (1.1.3)
     concurrent-ruby (1.1.6)
-    connection_pool (2.2.2)
+    connection_pool (2.2.3)
     crack (0.4.3)
       safe_yaml (~> 1.0.0)
     crass (1.0.6)
@@ -201,6 +201,7 @@ GEM
       dotenv (= 2.7.5)
       railties (>= 3.2, < 6.1)
     e2mmap (0.1.0)
+    ed25519 (1.2.4)
     elasticsearch (7.7.0)
       elasticsearch-api (= 7.7.0)
       elasticsearch-transport (= 7.7.0)
@@ -217,7 +218,7 @@ GEM
       tzinfo
     excon (0.73.0)
     fabrication (2.21.1)
-    faker (2.11.0)
+    faker (2.12.0)
       i18n (>= 1.6, < 2)
     faraday (1.0.1)
       multipart-post (>= 1.2, < 3)
@@ -235,14 +236,14 @@ GEM
     fog-json (1.2.0)
       fog-core
       multi_json (~> 1.10)
-    fog-openstack (0.3.7)
+    fog-openstack (0.3.10)
       fog-core (>= 1.45, <= 2.1.0)
       fog-json (>= 1.0)
       ipaddress (>= 0.8)
     formatador (0.2.5)
-    fugit (1.3.5)
+    fugit (1.3.6)
       et-orbi (~> 1.1, >= 1.1.8)
-      raabro (~> 1.1)
+      raabro (~> 1.3)
     fuubar (2.5.0)
       rspec-core (~> 3.0)
       ruby-progressbar (~> 1.4)
@@ -284,7 +285,7 @@ GEM
     httplog (1.4.2)
       rack (>= 1.0)
       rainbow (>= 2.0.0)
-    i18n (1.8.2)
+    i18n (1.8.3)
       concurrent-ruby (~> 1.0)
     i18n-tasks (0.9.31)
       activesupport (>= 4.0.2)
@@ -309,7 +310,7 @@ GEM
       multi_json (~> 1.14)
       rack (~> 2.0)
       rdf (~> 3.1)
-    json-ld-preloaded (3.1.2)
+    json-ld-preloaded (3.1.3)
       json-ld (~> 3.1)
       rdf (~> 3.1)
     jsonapi-renderer (0.2.2)
@@ -406,7 +407,7 @@ GEM
     parallel (1.19.1)
     parallel_tests (2.32.0)
       parallel
-    parser (2.7.1.2)
+    parser (2.7.1.3)
       ast (~> 2.4.0)
     parslet (2.0.0)
     pastel (0.7.4)
@@ -484,7 +485,7 @@ GEM
       thor (>= 0.19.0, < 2.0)
     rainbow (3.0.0)
     rake (13.0.1)
-    rdf (3.1.1)
+    rdf (3.1.2)
       hamster (~> 3.0)
       link_header (~> 0.0, >= 0.0.8)
     rdf-normalize (0.4.0)
@@ -509,10 +510,10 @@ GEM
       redis-store (>= 1.2, < 2)
     redis-store (1.8.2)
       redis (>= 4, < 5)
-    regexp_parser (1.7.0)
+    regexp_parser (1.7.1)
     request_store (1.5.0)
       rack (>= 1.4)
-    responders (3.0.0)
+    responders (3.0.1)
       actionpack (>= 5.0)
       railties (>= 5.0)
     rexml (3.2.4)
@@ -544,10 +545,11 @@ GEM
     rspec-support (3.9.3)
     rspec_junit_formatter (0.4.1)
       rspec-core (>= 2, < 4, != 2.12.0)
-    rubocop (0.84.0)
+    rubocop (0.85.1)
       parallel (~> 1.10)
       parser (>= 2.7.0.1)
       rainbow (>= 2.2.2, < 4.0)
+      regexp_parser (>= 1.7)
       rexml
       rubocop-ast (>= 0.0.3)
       ruby-progressbar (~> 1.7)
@@ -564,7 +566,7 @@ GEM
     rufus-scheduler (3.6.0)
       fugit (~> 1.1, >= 1.1.6)
     safe_yaml (1.0.5)
-    sanitize (5.1.0)
+    sanitize (5.2.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.8.0)
       nokogumbo (~> 2.0)
@@ -623,8 +625,6 @@ GEM
     thwait (0.1.0)
     tilt (2.0.10)
     tty-color (0.5.1)
-    tty-command (0.9.0)
-      pastel (~> 0.7.0)
     tty-cursor (0.7.1)
     tty-prompt (0.21.0)
       necromancer (~> 0.5.0)
@@ -634,7 +634,7 @@ GEM
       tty-cursor (~> 0.7)
       tty-screen (~> 0.7)
       wisper (~> 2.0.0)
-    tty-screen (0.7.1)
+    tty-screen (0.8.0)
     twitter-text (1.14.7)
       unf (~> 0.1.0)
     tzinfo (1.2.7)
@@ -662,7 +662,7 @@ GEM
       jwt (~> 2.0)
     websocket-driver (0.7.2)
       websocket-extensions (>= 0.1.0)
-    websocket-extensions (0.1.4)
+    websocket-extensions (0.1.5)
     wisper (2.0.1)
     xpath (3.2.0)
       nokogiri (~> 1.8)
@@ -675,7 +675,7 @@ DEPENDENCIES
   active_record_query_trace (~> 1.7)
   addressable (~> 2.7)
   annotate (~> 3.1)
-  aws-sdk-s3 (~> 1.66)
+  aws-sdk-s3 (~> 1.67)
   better_errors (~> 2.7)
   binding_of_caller (~> 0.7)
   blurhash (~> 0.1)
@@ -702,8 +702,9 @@ DEPENDENCIES
   doorkeeper (~> 5.4)
   dotenv-rails (~> 2.7)
   e2mmap (~> 0.1.0)
+  ed25519 (~> 1.2)
   fabrication (~> 2.21)
-  faker (~> 2.11)
+  faker (~> 2.12)
   fast_blank (~> 1.0)
   fastimage
   fog-core (<= 2.1.0)
@@ -773,10 +774,10 @@ DEPENDENCIES
   rspec-rails (~> 4.0)
   rspec-sidekiq (~> 3.0)
   rspec_junit_formatter (~> 0.4)
-  rubocop (~> 0.84)
+  rubocop (~> 0.85)
   rubocop-rails (~> 2.5)
   ruby-progressbar (~> 1.10)
-  sanitize (~> 5.1)
+  sanitize (~> 5.2)
   sidekiq (~> 6.0)
   sidekiq-bulk (~> 0.2.0)
   sidekiq-scheduler (~> 3.0)
@@ -792,7 +793,6 @@ DEPENDENCIES
   strong_migrations (~> 0.6)
   thor (~> 0.20)
   thwait (~> 0.1.0)
-  tty-command (~> 0.9)
   tty-prompt (~> 0.21)
   twitter-text (~> 1.14)
   tzinfo-data (~> 1.2020)
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..7625597fe
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,12 @@
+# Security Policy
+
+## Supported Versions
+
+| Version | Supported          |
+| ------- | ------------------ |
+| 3.1.x   | :white_check_mark: |
+| < 3.1   | :x:                |
+
+## Reporting a Vulnerability
+
+hello@joinmastodon.org
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 76703ed05..b8bca580f 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -1,7 +1,8 @@
 # frozen_string_literal: true
 
 class AccountsController < ApplicationController
-  PAGE_SIZE = 20
+  PAGE_SIZE     = 20
+  PAGE_SIZE_MAX = 200
 
   include AccountControllerConcern
   include SignatureAuthentication
@@ -41,7 +42,8 @@ class AccountsController < ApplicationController
       format.rss do
         expires_in 1.minute, public: true
 
-        @statuses = filtered_statuses.without_reblogs.limit(PAGE_SIZE)
+        limit     = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
+        @statuses = filtered_statuses.without_reblogs.limit(limit)
         @statuses = cache_collection(@statuses, Status)
         render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag])
       end
diff --git a/app/controllers/activitypub/claims_controller.rb b/app/controllers/activitypub/claims_controller.rb
new file mode 100644
index 000000000..08ad952df
--- /dev/null
+++ b/app/controllers/activitypub/claims_controller.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class ActivityPub::ClaimsController < ActivityPub::BaseController
+  include SignatureVerification
+  include AccountOwnedConcern
+
+  skip_before_action :authenticate_user!
+
+  before_action :require_signature!
+  before_action :set_claim_result
+
+  def create
+    render json: @claim_result, serializer: ActivityPub::OneTimeKeySerializer
+  end
+
+  private
+
+  def set_claim_result
+    @claim_result = ::Keys::ClaimService.new.call(@account.id, params[:id])
+  end
+end
diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb
index 9ca216e4f..e62fba748 100644
--- a/app/controllers/activitypub/collections_controller.rb
+++ b/app/controllers/activitypub/collections_controller.rb
@@ -5,8 +5,9 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
   include AccountOwnedConcern
 
   before_action :require_signature!, if: :authorized_fetch_mode?
+  before_action :set_items
   before_action :set_size
-  before_action :set_statuses
+  before_action :set_type
   before_action :set_cache_headers
 
   def show
@@ -16,40 +17,53 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
 
   private
 
-  def set_statuses
-    @statuses = scope_for_collection
-    @statuses = cache_collection(@statuses, Status)
+  def set_items
+    case params[:id]
+    when 'featured'
+      @items = begin
+        # Because in public fetch mode we cache the response, there would be no
+        # benefit from performing the check below, since a blocked account or domain
+        # would likely be served the cache from the reverse proxy anyway
+
+        if authorized_fetch_mode? && !signed_request_account.nil? && (@account.blocking?(signed_request_account) || (!signed_request_account.domain.nil? && @account.domain_blocking?(signed_request_account.domain)))
+          []
+        else
+          cache_collection(@account.pinned_statuses.not_local_only, Status)
+        end
+      end
+    when 'devices'
+      @items = @account.devices
+    else
+      not_found
+    end
   end
 
   def set_size
     case params[:id]
-    when 'featured'
-      @size = @account.pinned_statuses.not_local_only.count
+    when 'featured', 'devices'
+      @size = @items.size
     else
       not_found
     end
   end
 
-  def scope_for_collection
+  def set_type
     case params[:id]
     when 'featured'
-      # Because in public fetch mode we cache the response, there would be no
-      # benefit from performing the check below, since a blocked account or domain
-      # would likely be served the cache from the reverse proxy anyway
-      if authorized_fetch_mode? && !signed_request_account.nil? && (@account.blocking?(signed_request_account) || (!signed_request_account.domain.nil? && @account.domain_blocking?(signed_request_account.domain)))
-        Status.none
-      else
-        @account.pinned_statuses.not_local_only
-      end
+      @type = :ordered
+    when 'devices'
+      @type = :unordered
+    else
+      not_found
     end
   end
 
   def collection_presenter
     ActivityPub::CollectionPresenter.new(
       id: account_collection_url(@account, params[:id]),
-      type: :ordered,
+      type: @type,
       size: @size,
-      items: @statuses
+      items: @items
     )
   end
 end
diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb
index efa8f2950..71efb543e 100644
--- a/app/controllers/admin/custom_emojis_controller.rb
+++ b/app/controllers/admin/custom_emojis_controller.rb
@@ -33,6 +33,8 @@ module Admin
       @form.save
     rescue ActionController::ParameterMissing
       flash[:alert] = I18n.t('admin.accounts.no_account_selected')
+    rescue Mastodon::NotPermittedError
+      flash[:alert] = I18n.t('admin.custom_emojis.not_permitted')
     ensure
       redirect_to admin_custom_emojis_path(filter_params)
     end
diff --git a/app/controllers/api/v1/crypto/deliveries_controller.rb b/app/controllers/api/v1/crypto/deliveries_controller.rb
new file mode 100644
index 000000000..aa9df6e03
--- /dev/null
+++ b/app/controllers/api/v1/crypto/deliveries_controller.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::DeliveriesController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_current_device
+
+  def create
+    devices.each do |device_params|
+      DeliverToDeviceService.new.call(current_account, @current_device, device_params)
+    end
+
+    render_empty
+  end
+
+  private
+
+  def set_current_device
+    @current_device = Device.find_by!(access_token: doorkeeper_token)
+  end
+
+  def resource_params
+    params.require(:device)
+    params.permit(device: [:account_id, :device_id, :type, :body, :hmac])
+  end
+
+  def devices
+    Array(resource_params[:device])
+  end
+end
diff --git a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb
new file mode 100644
index 000000000..c764915e5
--- /dev/null
+++ b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController
+  LIMIT = 80
+
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_current_device
+
+  before_action :set_encrypted_messages,    only: :index
+  after_action  :insert_pagination_headers, only: :index
+
+  def index
+    render json: @encrypted_messages, each_serializer: REST::EncryptedMessageSerializer
+  end
+
+  def clear
+    @current_device.encrypted_messages.up_to(params[:up_to_id]).delete_all
+    render_empty
+  end
+
+  private
+
+  def set_current_device
+    @current_device = Device.find_by!(access_token: doorkeeper_token)
+  end
+
+  def set_encrypted_messages
+    @encrypted_messages = @current_device.encrypted_messages.paginate_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
+  end
+
+  def insert_pagination_headers
+    set_pagination_headers(next_path, prev_path)
+  end
+
+  def next_path
+    api_v1_crypto_encrypted_messages_url pagination_params(max_id: pagination_max_id) if records_continue?
+  end
+
+  def prev_path
+    api_v1_crypto_encrypted_messages_url pagination_params(min_id: pagination_since_id) unless @encrypted_messages.empty?
+  end
+
+  def pagination_max_id
+    @encrypted_messages.last.id
+  end
+
+  def pagination_since_id
+    @encrypted_messages.first.id
+  end
+
+  def records_continue?
+    @encrypted_messages.size == limit_param(LIMIT)
+  end
+
+  def pagination_params(core_params)
+    params.slice(:limit).permit(:limit).merge(core_params)
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/claims_controller.rb b/app/controllers/api/v1/crypto/keys/claims_controller.rb
new file mode 100644
index 000000000..34b21a380
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/claims_controller.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::ClaimsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_claim_results
+
+  def create
+    render json: @claim_results, each_serializer: REST::Keys::ClaimResultSerializer
+  end
+
+  private
+
+  def set_claim_results
+    @claim_results = devices.map { |device_params| ::Keys::ClaimService.new.call(current_account, device_params[:account_id], device_params[:device_id]) }.compact
+  end
+
+  def resource_params
+    params.permit(device: [:account_id, :device_id])
+  end
+
+  def devices
+    Array(resource_params[:device])
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/counts_controller.rb b/app/controllers/api/v1/crypto/keys/counts_controller.rb
new file mode 100644
index 000000000..ffd7151b7
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/counts_controller.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::CountsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_current_device
+
+  def show
+    render json: { one_time_keys: @current_device.one_time_keys.count }
+  end
+
+  private
+
+  def set_current_device
+    @current_device = Device.find_by!(access_token: doorkeeper_token)
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/queries_controller.rb b/app/controllers/api/v1/crypto/keys/queries_controller.rb
new file mode 100644
index 000000000..0851d797d
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/queries_controller.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::QueriesController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_accounts
+  before_action :set_query_results
+
+  def create
+    render json: @query_results, each_serializer: REST::Keys::QueryResultSerializer
+  end
+
+  private
+
+  def set_accounts
+    @accounts = Account.where(id: account_ids).includes(:devices)
+  end
+
+  def set_query_results
+    @query_results = @accounts.map { |account| ::Keys::QueryService.new.call(account) }.compact
+  end
+
+  def account_ids
+    Array(params[:id]).map(&:to_i)
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/uploads_controller.rb b/app/controllers/api/v1/crypto/keys/uploads_controller.rb
new file mode 100644
index 000000000..fc4abf63b
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/uploads_controller.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::UploadsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+
+  def create
+    device = Device.find_or_initialize_by(access_token: doorkeeper_token)
+
+    device.transaction do
+      device.account = current_account
+      device.update!(resource_params[:device])
+
+      if resource_params[:one_time_keys].present? && resource_params[:one_time_keys].is_a?(Enumerable)
+        resource_params[:one_time_keys].each do |one_time_key_params|
+          device.one_time_keys.create!(one_time_key_params)
+        end
+      end
+    end
+
+    render json: device, serializer: REST::Keys::DeviceSerializer
+  end
+
+  private
+
+  def resource_params
+    params.permit(device: [:device_id, :name, :fingerprint_key, :identity_key], one_time_keys: [:key_id, :key, :signature])
+  end
+end
diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb
index c36561b86..c54f6643a 100644
--- a/app/controllers/auth/sessions_controller.rb
+++ b/app/controllers/auth/sessions_controller.rb
@@ -9,7 +9,9 @@ class Auth::SessionsController < Devise::SessionsController
   skip_before_action :require_functional!
 
   prepend_before_action :set_pack
-  prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create]
+
+  include TwoFactorAuthenticationConcern
+  include SignInTokenAuthenticationConcern
 
   before_action :set_instance_presenter, only: [:new]
   before_action :set_body_classes
@@ -40,8 +42,8 @@ class Auth::SessionsController < Devise::SessionsController
   protected
 
   def find_user
-    if session[:otp_user_id]
-      User.find(session[:otp_user_id])
+    if session[:attempt_user_id]
+      User.find(session[:attempt_user_id])
     else
       user   = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication
       user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication
@@ -50,7 +52,7 @@ class Auth::SessionsController < Devise::SessionsController
   end
 
   def user_params
-    params.require(:user).permit(:email, :password, :otp_attempt)
+    params.require(:user).permit(:email, :password, :otp_attempt, :sign_in_token_attempt)
   end
 
   def after_sign_in_path_for(resource)
@@ -71,48 +73,6 @@ class Auth::SessionsController < Devise::SessionsController
     super
   end
 
-  def two_factor_enabled?
-    find_user&.otp_required_for_login?
-  end
-
-  def valid_otp_attempt?(user)
-    user.validate_and_consume_otp!(user_params[:otp_attempt]) ||
-      user.invalidate_otp_backup_code!(user_params[:otp_attempt])
-  rescue OpenSSL::Cipher::CipherError
-    false
-  end
-
-  def authenticate_with_two_factor
-    user = self.resource = find_user
-
-    if user_params[:otp_attempt].present? && session[:otp_user_id]
-      authenticate_with_two_factor_via_otp(user)
-    elsif user.present? && (user.encrypted_password.blank? || user.valid_password?(user_params[:password]))
-      # If encrypted_password is blank, we got the user from LDAP or PAM,
-      # so credentials are already valid
-
-      prompt_for_two_factor(user)
-    end
-  end
-
-  def authenticate_with_two_factor_via_otp(user)
-    if valid_otp_attempt?(user)
-      session.delete(:otp_user_id)
-      remember_me(user)
-      sign_in(user)
-    else
-      flash.now[:alert] = I18n.t('users.invalid_otp_token')
-      prompt_for_two_factor(user)
-    end
-  end
-
-  def prompt_for_two_factor(user)
-    session[:otp_user_id] = user.id
-    use_pack 'auth'
-    @body_classes = 'lighter'
-    render :two_factor
-  end
-
   def require_no_authentication
     super
     # Delete flash message that isn't entirely useful and may be confusing in
diff --git a/app/controllers/concerns/sign_in_token_authentication_concern.rb b/app/controllers/concerns/sign_in_token_authentication_concern.rb
new file mode 100644
index 000000000..88c009b19
--- /dev/null
+++ b/app/controllers/concerns/sign_in_token_authentication_concern.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module SignInTokenAuthenticationConcern
+  extend ActiveSupport::Concern
+
+  included do
+    prepend_before_action :authenticate_with_sign_in_token, if: :sign_in_token_required?, only: [:create]
+  end
+
+  def sign_in_token_required?
+    find_user&.suspicious_sign_in?(request.remote_ip)
+  end
+
+  def valid_sign_in_token_attempt?(user)
+    Devise.secure_compare(user.sign_in_token, user_params[:sign_in_token_attempt])
+  end
+
+  def authenticate_with_sign_in_token
+    user = self.resource = find_user
+
+    if user_params[:sign_in_token_attempt].present? && session[:attempt_user_id]
+      authenticate_with_sign_in_token_attempt(user)
+    elsif user.present? && user.external_or_valid_password?(user_params[:password])
+      prompt_for_sign_in_token(user)
+    end
+  end
+
+  def authenticate_with_sign_in_token_attempt(user)
+    if valid_sign_in_token_attempt?(user)
+      session.delete(:attempt_user_id)
+      remember_me(user)
+      sign_in(user)
+    else
+      flash.now[:alert] = I18n.t('users.invalid_sign_in_token')
+      prompt_for_sign_in_token(user)
+    end
+  end
+
+  def prompt_for_sign_in_token(user)
+    if user.sign_in_token_expired?
+      user.generate_sign_in_token && user.save
+      UserMailer.sign_in_token(user, request.remote_ip, request.user_agent, Time.now.utc.to_s).deliver_later!
+    end
+
+    session[:attempt_user_id] = user.id
+    use_pack 'auth'
+    @body_classes = 'lighter'
+    render :sign_in_token
+  end
+end
diff --git a/app/controllers/concerns/two_factor_authentication_concern.rb b/app/controllers/concerns/two_factor_authentication_concern.rb
new file mode 100644
index 000000000..0d9f87455
--- /dev/null
+++ b/app/controllers/concerns/two_factor_authentication_concern.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module TwoFactorAuthenticationConcern
+  extend ActiveSupport::Concern
+
+  included do
+    prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create]
+  end
+
+  def two_factor_enabled?
+    find_user&.otp_required_for_login?
+  end
+
+  def valid_otp_attempt?(user)
+    user.validate_and_consume_otp!(user_params[:otp_attempt]) ||
+      user.invalidate_otp_backup_code!(user_params[:otp_attempt])
+  rescue OpenSSL::Cipher::CipherError
+    false
+  end
+
+  def authenticate_with_two_factor
+    user = self.resource = find_user
+
+    if user_params[:otp_attempt].present? && session[:attempt_user_id]
+      authenticate_with_two_factor_attempt(user)
+    elsif user.present? && user.external_or_valid_password?(user_params[:password])
+      prompt_for_two_factor(user)
+    end
+  end
+
+  def authenticate_with_two_factor_attempt(user)
+    if valid_otp_attempt?(user)
+      session.delete(:attempt_user_id)
+      remember_me(user)
+      sign_in(user)
+    else
+      flash.now[:alert] = I18n.t('users.invalid_otp_token')
+      prompt_for_two_factor(user)
+    end
+  end
+
+  def prompt_for_two_factor(user)
+    session[:attempt_user_id] = user.id
+    use_pack 'auth'
+    @body_classes = 'lighter'
+    render :two_factor
+  end
+end
diff --git a/app/controllers/settings/migration/redirects_controller.rb b/app/controllers/settings/migration/redirects_controller.rb
index 6e5b72ffb..97193ade0 100644
--- a/app/controllers/settings/migration/redirects_controller.rb
+++ b/app/controllers/settings/migration/redirects_controller.rb
@@ -18,7 +18,7 @@ class Settings::Migration::RedirectsController < Settings::BaseController
     if @redirect.valid_with_challenge?(current_user)
       current_account.update!(moved_to_account: @redirect.target_account)
       ActivityPub::UpdateDistributionWorker.perform_async(current_account.id)
-      redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct)
+      redirect_to settings_migration_path, notice: I18n.t('migrations.redirected_msg', acct: current_account.moved_to_account.acct)
     else
       render :new
     end
diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
index a1b7f4320..b0abad984 100644
--- a/app/controllers/statuses_controller.rb
+++ b/app/controllers/statuses_controller.rb
@@ -44,7 +44,7 @@ class StatusesController < ApplicationController
 
   def activity
     expires_in 3.minutes, public: @status.distributable? && public_fetch_mode?
-    render_with_cache json: @status, content_type: 'application/activity+json', serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter
+    render_with_cache json: ActivityPub::ActivityPresenter.from_status(@status), content_type: 'application/activity+json', serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter
   end
 
   def embed
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index 3d12c9eaf..2363cb31b 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -3,7 +3,8 @@
 class TagsController < ApplicationController
   include SignatureVerification
 
-  PAGE_SIZE = 20
+  PAGE_SIZE     = 20
+  PAGE_SIZE_MAX = 200
 
   layout 'public'
 
@@ -26,6 +27,7 @@ class TagsController < ApplicationController
       format.rss do
         expires_in 0, public: true
 
+        limit     = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
         @statuses = HashtagQueryService.new.call(@tag, filter_params, nil, @local).limit(PAGE_SIZE)
         @statuses = cache_collection(@statuses, Status)
 
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 40f914f1e..2f11ccb6f 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -137,6 +137,11 @@ module ApplicationHelper
       text: [params[:title], params[:text], params[:url]].compact.join(' '),
     }
 
+    permit_visibilities = %w(public unlisted private direct)
+    default_privacy     = current_account&.user&.setting_default_privacy
+    permit_visibilities.shift(permit_visibilities.index(default_privacy) + 1) if default_privacy.present?
+    state_params[:visibility] = params[:visibility] if permit_visibilities.include? params[:visibility]
+
     if user_signed_in?
       state_params[:settings]          = state_params[:settings].merge(Web::Setting.find_by(user: current_user)&.data || {})
       state_params[:push_subscription] = current_account.user.web_push_subscription(current_session)
diff --git a/app/helpers/webfinger_helper.rb b/app/helpers/webfinger_helper.rb
index 70c493210..ab7ca4698 100644
--- a/app/helpers/webfinger_helper.rb
+++ b/app/helpers/webfinger_helper.rb
@@ -1,5 +1,16 @@
 # frozen_string_literal: true
 
+# Monkey-patch on monkey-patch.
+# Because it conflicts with the request.rb patch.
+class HTTP::Timeout::PerOperationOriginal < HTTP::Timeout::PerOperation
+  def connect(socket_class, host, port, nodelay = false)
+    ::Timeout.timeout(@connect_timeout, HTTP::TimeoutError) do
+      @socket = socket_class.open(host, port)
+      @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay
+    end
+  end
+end
+
 module WebfingerHelper
   def webfinger!(uri)
     hidden_service_uri = /\.(onion|i2p)(:\d+)?$/.match(uri)
@@ -12,6 +23,14 @@ module WebfingerHelper
       headers: {
         'User-Agent': Mastodon::Version.user_agent,
       },
+
+      timeout_class: HTTP::Timeout::PerOperationOriginal,
+
+      timeout_options: {
+        write_timeout: 10,
+        connect_timeout: 5,
+        read_timeout: 10,
+      },
     }
 
     Goldfinger::Client.new(uri, opts.merge(Rails.configuration.x.http_client_proxy)).finger
diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js
index f7cbe4c1c..dca44917a 100644
--- a/app/javascript/mastodon/actions/importer/normalizer.js
+++ b/app/javascript/mastodon/actions/importer/normalizer.js
@@ -12,7 +12,7 @@ const makeEmojiMap = record => record.emojis.reduce((obj, emoji) => {
 
 export function searchTextFromRawStatus (status) {
   const spoilerText   = status.spoiler_text || '';
-  const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
+  const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
   return domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
 }
 
diff --git a/app/javascript/mastodon/components/autosuggest_textarea.js b/app/javascript/mastodon/components/autosuggest_textarea.js
index ac2a6366a..58ec4f6eb 100644
--- a/app/javascript/mastodon/components/autosuggest_textarea.js
+++ b/app/javascript/mastodon/components/autosuggest_textarea.js
@@ -208,7 +208,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
             <span style={{ display: 'none' }}>{placeholder}</span>
 
             <Textarea
-              inputRef={this.setTextarea}
+              ref={this.setTextarea}
               className='autosuggest-textarea__textarea'
               disabled={disabled}
               placeholder={placeholder}
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 9e4442cef..f99ccd39a 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -401,6 +401,7 @@ class Status extends ImmutablePureComponent {
           compact
           cacheWidth={this.props.cacheMediaWidth}
           defaultWidth={this.props.cachedMediaWidth}
+          sensitive={status.get('sensitive')}
         />
       );
     }
diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js
index c8425c4c6..36bbde0c0 100644
--- a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js
+++ b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js
@@ -76,7 +76,7 @@ describe('emoji', () => {
 
     it('skips the textual presentation VS15 character', () => {
       expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15
-        .toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734.svg" />');
+        .toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734_border.svg" />');
     });
   });
 });
diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js
index cd10e20b7..382ba683f 100644
--- a/app/javascript/mastodon/features/emoji/emoji.js
+++ b/app/javascript/mastodon/features/emoji/emoji.js
@@ -6,6 +6,15 @@ const trie = new Trie(Object.keys(unicodeMapping));
 
 const assetHost = process.env.CDN_HOST || '';
 
+// Emoji requiring extra borders depending on theme
+const darkEmoji = '🎱🐜⚫🖤⬛◼️◾◼️✒️▪️💣🎳📷📸♣️🕶️✴️🔌💂‍♀️📽️🍳🦍💂🔪🕳️🕹️🕋🖊️🖋️💂‍♂️🎤🎓🎥🎼♠️🎩🦃📼📹🎮🐃🏴';
+const lightEmoji = '👽⚾🐔☁️💨🕊️👀🍥👻🐐❕❔⛸️🌩️🔊🔇📃🌧️🐏🍚🍙🐓🐑💀☠️🌨️🔉🔈💬💭🏐🏳️⚪⬜◽◻️▫️';
+
+const emojiFilename = (filename, match) => {
+  const borderedEmoji = document.body.classList.contains('theme-mastodon-light') ? lightEmoji : darkEmoji;
+  return borderedEmoji.includes(match) ? (filename + '_border') : filename;
+};
+
 const emojify = (str, customEmojis = {}) => {
   const tagCharsWithoutEmojis = '<&';
   const tagCharsWithEmojis = Object.keys(customEmojis).length ? '<&:' : '<&';
@@ -60,7 +69,7 @@ const emojify = (str, customEmojis = {}) => {
     } else { // matched to unicode emoji
       const { filename, shortCode } = unicodeMapping[match];
       const title = shortCode ? `:${shortCode}:` : '';
-      replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${filename}.svg" />`;
+      replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${emojiFilename(filename, match)}.svg" />`;
       rend = i + match.length;
       // If the matched character was followed by VS15 (for selecting text presentation), skip it.
       if (str.codePointAt(rend) === 65038) {
diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js
index b8344a667..630e99f2c 100644
--- a/app/javascript/mastodon/features/status/components/card.js
+++ b/app/javascript/mastodon/features/status/components/card.js
@@ -2,9 +2,13 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import Immutable from 'immutable';
 import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
 import punycode from 'punycode';
 import classnames from 'classnames';
 import Icon from 'mastodon/components/icon';
+import classNames from 'classnames';
+import { useBlurhash } from 'mastodon/initial_state';
+import { decode } from 'blurhash';
 
 const IDNA_PREFIX = 'xn--';
 
@@ -63,6 +67,7 @@ export default class Card extends React.PureComponent {
     compact: PropTypes.bool,
     defaultWidth: PropTypes.number,
     cacheWidth: PropTypes.func,
+    sensitive: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -72,12 +77,44 @@ export default class Card extends React.PureComponent {
 
   state = {
     width: this.props.defaultWidth || 280,
+    previewLoaded: false,
     embedded: false,
+    revealed: !this.props.sensitive,
   };
 
   componentWillReceiveProps (nextProps) {
     if (!Immutable.is(this.props.card, nextProps.card)) {
-      this.setState({ embedded: false });
+      this.setState({ embedded: false, previewLoaded: false });
+    }
+    if (this.props.sensitive !== nextProps.sensitive) {
+      this.setState({ revealed: !nextProps.sensitive });
+    }
+  }
+
+  componentDidMount () {
+    if (this.props.card && this.props.card.get('blurhash')) {
+      this._decode();
+    }
+  }
+
+  componentDidUpdate (prevProps) {
+    const { card } = this.props;
+    if (card.get('blurhash') && (!prevProps.card || prevProps.card.get('blurhash') !== card.get('blurhash'))) {
+      this._decode();
+    }
+  }
+
+  _decode () {
+    if (!useBlurhash) return;
+
+    const hash   = this.props.card.get('blurhash');
+    const pixels = decode(hash, 32, 32);
+
+    if (pixels) {
+      const ctx       = this.canvas.getContext('2d');
+      const imageData = new ImageData(pixels, 32, 32);
+
+      ctx.putImageData(imageData, 0, 0);
     }
   }
 
@@ -119,6 +156,18 @@ export default class Card extends React.PureComponent {
     }
   }
 
+  setCanvasRef = c => {
+    this.canvas = c;
+  }
+
+  handleImageLoad = () => {
+    this.setState({ previewLoaded: true });
+  }
+
+  handleReveal = () => {
+    this.setState({ revealed: true });
+  }
+
   renderVideo () {
     const { card }  = this.props;
     const content   = { __html: addAutoPlay(card.get('html')) };
@@ -138,7 +187,7 @@ export default class Card extends React.PureComponent {
 
   render () {
     const { card, maxDescription, compact } = this.props;
-    const { width, embedded } = this.state;
+    const { width, embedded, revealed } = this.state;
 
     if (card === null) {
       return null;
@@ -153,7 +202,7 @@ export default class Card extends React.PureComponent {
     const height      = (compact && !embedded) ? (width / (16 / 9)) : (width / ratio);
 
     const description = (
-      <div className='status-card__content'>
+      <div className={classNames('status-card__content', { 'status-card__content--blurred': !revealed })}>
         {title}
         {!(horizontal || compact) && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>}
         <span className='status-card__host'>{provider}</span>
@@ -161,7 +210,18 @@ export default class Card extends React.PureComponent {
     );
 
     let embed     = '';
-    let thumbnail = <div style={{ backgroundImage: `url(${card.get('image')})`, width: horizontal ? width : null, height: horizontal ? height : null }} className='status-card__image-image' />;
+    let canvas = <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('status-card__image-preview', { 'status-card__image-preview--hidden' : revealed && this.state.previewLoaded })} />;
+    let thumbnail = <img src={card.get('image')} alt='' style={{ width: horizontal ? width : null, height: horizontal ? height : null, visibility: revealed ? null : 'hidden' }} onLoad={this.handleImageLoad} className='status-card__image-image' />;
+    let spoilerButton = (
+      <button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
+        <span className='spoiler-button__overlay__label'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span>
+      </button>
+    );
+    spoilerButton = (
+      <div className={classNames('spoiler-button', { 'spoiler-button--minified': revealed })}>
+        {spoilerButton}
+      </div>
+    );
 
     if (interactive) {
       if (embedded) {
@@ -175,14 +235,18 @@ export default class Card extends React.PureComponent {
 
         embed = (
           <div className='status-card__image'>
+            {canvas}
             {thumbnail}
 
-            <div className='status-card__actions'>
-              <div>
-                <button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
-                {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
+            {revealed && (
+              <div className='status-card__actions'>
+                <div>
+                  <button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
+                  {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
+                </div>
               </div>
-            </div>
+            )}
+            {!revealed && spoilerButton}
           </div>
         );
       }
@@ -196,13 +260,16 @@ export default class Card extends React.PureComponent {
     } else if (card.get('image')) {
       embed = (
         <div className='status-card__image'>
+          {canvas}
           {thumbnail}
+          {!revealed && spoilerButton}
         </div>
       );
     } else {
       embed = (
         <div className='status-card__image'>
           <Icon id='file-text' />
+          {!revealed && spoilerButton}
         </div>
       );
     }
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index 4201b237e..2ac47677e 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -153,7 +153,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         );
       }
     } else if (status.get('spoiler_text').length === 0) {
-      media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
+      media = <Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
     }
 
     if (status.get('application')) {
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 225126e6f..57eddd402 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -106,7 +106,7 @@
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Are you sure you want to block {name}?",
   "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete.message": "Are you sure you want to delete this toot?",
   "confirmations.delete_list.confirm": "Delete",
   "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
   "confirmations.domain_block.confirm": "Block entire domain",
@@ -117,7 +117,7 @@
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "confirmations.mute.message": "Are you sure you want to mute {name}?",
   "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
   "confirmations.reply.confirm": "Reply",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
@@ -130,7 +130,7 @@
   "directory.local": "From {domain} only",
   "directory.new_arrivals": "New arrivals",
   "directory.recently_active": "Recently active",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.instructions": "Embed this toot on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
   "emoji_button.custom": "Custom",
@@ -159,7 +159,7 @@
   "empty_column.hashtag": "There is nothing in this hashtag yet.",
   "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
   "empty_column.home.public_timeline": "the public timeline",
-  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new toots, they will appear here.",
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
@@ -216,12 +216,12 @@
   "keyboard_shortcuts.back": "to navigate back",
   "keyboard_shortcuts.blocked": "to open blocked users list",
   "keyboard_shortcuts.boost": "to boost",
-  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.column": "to focus a toot in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
   "keyboard_shortcuts.description": "Description",
   "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.enter": "to open toot",
   "keyboard_shortcuts.favourite": "to favourite",
   "keyboard_shortcuts.favourites": "to open favourites list",
   "keyboard_shortcuts.federated": "to open federated timeline",
@@ -289,13 +289,13 @@
   "navigation_bar.preferences": "Preferences",
   "navigation_bar.public_timeline": "Federated timeline",
   "navigation_bar.security": "Security",
-  "notification.favourite": "{name} favourited your status",
+  "notification.favourite": "{name} favourited your toot",
   "notification.follow": "{name} followed you",
   "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
-  "notification.reblog": "{name} boosted your status",
+  "notification.reblog": "{name} boosted your toot",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -326,7 +326,7 @@
   "poll.voted": "You voted for this answer",
   "poll_button.add_poll": "Add a poll",
   "poll_button.remove_poll": "Remove poll",
-  "privacy.change": "Adjust status privacy",
+  "privacy.change": "Adjust toot privacy",
   "privacy.direct.long": "Visible for mentioned users only",
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Visible for followers only",
@@ -353,9 +353,9 @@
   "report.target": "Reporting {target}",
   "search.placeholder": "Search",
   "search_popout.search_format": "Advanced search format",
-  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.full_text": "Simple text returns toots you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
   "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "status",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
   "search_popout.tips.user": "user",
   "search_results.accounts": "People",
@@ -364,12 +364,12 @@
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_status": "Open this toot in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
+  "status.copy": "Copy link to toot",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -382,7 +382,7 @@
   "status.more": "More",
   "status.mute": "Mute @{name}",
   "status.mute_conversation": "Mute conversation",
-  "status.open": "Expand this status",
+  "status.open": "Expand this toot",
   "status.pin": "Pin on profile",
   "status.pinned": "Pinned toot",
   "status.read_more": "Read more",
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index c68944528..bc039ff03 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -39,3 +39,5 @@ $account-background-color: $white !default;
 @function lighten($color, $amount) {
   @return hsl(hue($color), saturation($color), lightness($color) - $amount);
 }
+
+$emojis-requiring-inversion: 'chains';
diff --git a/app/javascript/styles/mastodon/accessibility.scss b/app/javascript/styles/mastodon/accessibility.scss
index d33806c84..c5bcb5941 100644
--- a/app/javascript/styles/mastodon/accessibility.scss
+++ b/app/javascript/styles/mastodon/accessibility.scss
@@ -1,14 +1,13 @@
-$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';
+$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
 
-%white-emoji-outline {
-  filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);
-  transform: scale(.71);
+%emoji-color-inversion {
+  filter: invert(1);
 }
 
 .emojione {
-  @each $emoji in $black-emojis {
+  @each $emoji in $emojis-requiring-inversion {
     &[title=':#{$emoji}:'] {
-      @extend %white-emoji-outline;
+      @extend %emoji-color-inversion;
     }
   }
 }
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 64f97c648..80490f452 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -3097,6 +3097,11 @@ a.status-card {
   flex: 1 1 auto;
   overflow: hidden;
   padding: 14px 14px 14px 8px;
+
+  &--blurred {
+    filter: blur(2px);
+    pointer-events: none;
+  }
 }
 
 .status-card__description {
@@ -3134,7 +3139,8 @@ a.status-card {
     width: 100%;
   }
 
-  .status-card__image-image {
+  .status-card__image-image,
+  .status-card__image-preview {
     border-radius: 4px 4px 0 0;
   }
 
@@ -3179,6 +3185,24 @@ a.status-card.compact:hover {
   background-position: center center;
 }
 
+.status-card__image-preview {
+  border-radius: 4px 0 0 4px;
+  display: block;
+  margin: 0;
+  width: 100%;
+  height: 100%;
+  object-fit: fill;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 0;
+  background: $base-overlay-background;
+
+  &--hidden {
+    display: none;
+  }
+}
+
 .load-more {
   display: block;
   color: $dark-text-color;
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 572b8087e..3509a6c40 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -2,6 +2,45 @@
 
 class ActivityPub::Activity::Create < ActivityPub::Activity
   def perform
+    case @object['type']
+    when 'EncryptedMessage'
+      create_encrypted_message
+    else
+      create_status
+    end
+  end
+
+  private
+
+  def create_encrypted_message
+    return reject_payload! if invalid_origin?(@object['id']) || @options[:delivered_to_account_id].blank?
+
+    target_account = Account.find(@options[:delivered_to_account_id])
+    target_device  = target_account.devices.find_by(device_id: @object.dig('to', 'deviceId'))
+
+    return if target_device.nil?
+
+    target_device.encrypted_messages.create!(
+      from_account: @account,
+      from_device_id: @object.dig('attributedTo', 'deviceId'),
+      type: @object['messageType'],
+      body: @object['cipherText'],
+      digest: @object.dig('digest', 'digestValue'),
+      message_franking: message_franking.to_token
+    )
+  end
+
+  def message_franking
+    MessageFranking.new(
+      hmac: @object.dig('digest', 'digestValue'),
+      original_franking: @object['messageFranking'],
+      source_account_id: @account.id,
+      target_account_id: @options[:delivered_to_account_id],
+      timestamp: Time.now.utc
+    )
+  end
+
+  def create_status
     return reject_payload! if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity?
 
     RedisLock.acquire(lock_options) do |lock|
@@ -23,8 +62,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     @status
   end
 
-  private
-
   def audience_to
     @object['to'] || @json['to']
   end
@@ -262,6 +299,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   def poll_vote!
     poll = replied_to_status.preloadable_poll
     already_voted = true
+
     RedisLock.acquire(poll_lock_options) do |lock|
       if lock.acquired?
         already_voted = poll.votes.where(account: @account).exists?
@@ -270,20 +308,24 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
         raise Mastodon::RaceConditionError
       end
     end
+
     increment_voters_count! unless already_voted
     ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, replied_to_status.id) unless replied_to_status.preloadable_poll.hide_totals?
   end
 
   def resolve_thread(status)
     return unless status.reply? && status.thread.nil? && Request.valid_url?(in_reply_to_uri)
+
     ThreadResolveWorker.perform_async(status.id, in_reply_to_uri)
   end
 
   def fetch_replies(status)
     collection = @object['replies']
     return if collection.nil?
+
     replies = ActivityPub::FetchRepliesService.new.call(status, collection, false)
     return unless replies.nil?
+
     uri = value_or_id(collection)
     ActivityPub::FetchRepliesWorker.perform_async(status.id, uri) unless uri.nil?
   end
@@ -291,6 +333,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   def conversation_from_uri(uri)
     return nil if uri.nil?
     return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
+
     begin
       Conversation.find_or_create_by!(uri: uri)
     rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
@@ -404,6 +447,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 
   def skip_download?
     return @skip_download if defined?(@skip_download)
+
     @skip_download ||= DomainBlock.reject_media?(@account.domain)
   end
 
@@ -436,11 +480,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 
   def forward_for_reply
     return unless @json['signature'].present? && reply_to_local?
+
     ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url])
   end
 
   def increment_voters_count!
     poll = replied_to_status.preloadable_poll
+
     unless poll.voters_count.nil?
       poll.voters_count = poll.voters_count + 1
       poll.save
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index 78138fb73..634ed29fa 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -22,6 +22,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
     blurhash: { 'toot' => 'http://joinmastodon.org/ns#', 'blurhash' => 'toot:blurhash' },
     discoverable: { 'toot' => 'http://joinmastodon.org/ns#', 'discoverable' => 'toot:discoverable' },
     voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' },
+    olm: { 'toot' => 'http://joinmastodon.org/ns#', 'Device' => 'toot:Device', 'Ed25519Signature' => 'toot:Ed25519Signature', 'Ed25519Key' => 'toot:Ed25519Key', 'Curve25519Key' => 'toot:Curve25519Key', 'EncryptedMessage' => 'toot:EncryptedMessage', 'publicKeyBase64' => 'toot:publicKeyBase64', 'deviceId' => 'toot:deviceId', 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, 'messageFranking' => 'toot:messageFranking', 'messageType' => 'toot:messageType', 'cipherText' => 'toot:cipherText' },
   }.freeze
 
   def self.default_key_transform
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 3ce182809..8b3198df7 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -287,9 +287,14 @@ class FeedManager
     combined_regex = active_filters.reduce { |memo, obj| Regexp.union(memo, obj) }
     status         = status.reblog if status.reblog?
 
-    !combined_regex.match(Formatter.instance.plaintext(status)).nil? ||
-      (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?) ||
-      (status.preloadable_poll && !combined_regex.match(status.preloadable_poll.options.join("\n\n")).nil?)
+    combined_text = [
+      Formatter.instance.plaintext(status),
+      status.spoiler_text,
+      status.preloadable_poll ? status.preloadable_poll.options.join("\n\n") : nil,
+      status.media_attachments.map(&:description).join("\n\n"),
+    ].compact.join("\n\n")
+
+    !combined_regex.match(combined_text).nil?
   end
 
   # Adds a status to an account's feed, returning true if a status was
diff --git a/app/lib/inline_renderer.rb b/app/lib/inline_renderer.rb
index 27e334a4d..b70814748 100644
--- a/app/lib/inline_renderer.rb
+++ b/app/lib/inline_renderer.rb
@@ -19,6 +19,8 @@ class InlineRenderer
       serializer = REST::AnnouncementSerializer
     when :reaction
       serializer = REST::ReactionSerializer
+    when :encrypted_message
+      serializer = REST::EncryptedMessageSerializer
     else
       return
     end
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index 88a11f761..2cd58e60a 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -126,4 +126,21 @@ class UserMailer < Devise::Mailer
            reply_to: Setting.site_contact_email
     end
   end
+
+  def sign_in_token(user, remote_ip, user_agent, timestamp)
+    @resource   = user
+    @instance   = Rails.configuration.x.local_domain
+    @remote_ip  = remote_ip
+    @user_agent = user_agent
+    @detection  = Browser.new(user_agent)
+    @timestamp  = timestamp.to_time.utc
+
+    return if @resource.disabled?
+
+    I18n.with_locale(@resource.locale || I18n.default_locale) do
+      mail to: @resource.email,
+           subject: I18n.t('user_mailer.sign_in_token.subject'),
+           reply_to: Setting.site_contact_email
+    end
+  end
 end
diff --git a/app/models/account.rb b/app/models/account.rb
index 5038d4768..0b3c48543 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -49,6 +49,7 @@
 #  hide_collections              :boolean
 #  avatar_storage_schema_version :integer
 #  header_storage_schema_version :integer
+#  devices_url                   :string
 #
 
 class Account < ApplicationRecord
diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb
index 499edbf4e..cca3a17fa 100644
--- a/app/models/concerns/account_associations.rb
+++ b/app/models/concerns/account_associations.rb
@@ -9,6 +9,7 @@ module AccountAssociations
 
     # Identity proofs
     has_many :identity_proofs, class_name: 'AccountIdentityProof', dependent: :destroy, inverse_of: :account
+    has_many :devices, dependent: :destroy, inverse_of: :account
 
     # Timelines
     has_many :statuses, inverse_of: :account, dependent: :destroy
diff --git a/app/models/device.rb b/app/models/device.rb
new file mode 100644
index 000000000..97d0d2774
--- /dev/null
+++ b/app/models/device.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: devices
+#
+#  id              :bigint(8)        not null, primary key
+#  access_token_id :bigint(8)
+#  account_id      :bigint(8)
+#  device_id       :string           default(""), not null
+#  name            :string           default(""), not null
+#  fingerprint_key :text             default(""), not null
+#  identity_key    :text             default(""), not null
+#  created_at      :datetime         not null
+#  updated_at      :datetime         not null
+#
+
+class Device < ApplicationRecord
+  belongs_to :access_token, class_name: 'Doorkeeper::AccessToken'
+  belongs_to :account
+
+  has_many :one_time_keys, dependent: :destroy, inverse_of: :device
+  has_many :encrypted_messages, dependent: :destroy, inverse_of: :device
+
+  validates :name, :fingerprint_key, :identity_key, presence: true
+  validates :fingerprint_key, :identity_key, ed25519_key: true
+
+  before_save :invalidate_associations, if: -> { device_id_changed? || fingerprint_key_changed? || identity_key_changed? }
+
+  private
+
+  def invalidate_associations
+    one_time_keys.destroy_all
+    encrypted_messages.destroy_all
+  end
+end
diff --git a/app/models/encrypted_message.rb b/app/models/encrypted_message.rb
new file mode 100644
index 000000000..5e0aba434
--- /dev/null
+++ b/app/models/encrypted_message.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: encrypted_messages
+#
+#  id               :bigint(8)        not null, primary key
+#  device_id        :bigint(8)
+#  from_account_id  :bigint(8)
+#  from_device_id   :string           default(""), not null
+#  type             :integer          default(0), not null
+#  body             :text             default(""), not null
+#  digest           :text             default(""), not null
+#  message_franking :text             default(""), not null
+#  created_at       :datetime         not null
+#  updated_at       :datetime         not null
+#
+
+class EncryptedMessage < ApplicationRecord
+  self.inheritance_column = nil
+
+  include Paginable
+
+  scope :up_to, ->(id) { where(arel_table[:id].lteq(id)) }
+
+  belongs_to :device
+  belongs_to :from_account, class_name: 'Account'
+
+  around_create Mastodon::Snowflake::Callbacks
+
+  after_commit :push_to_streaming_api
+
+  private
+
+  def push_to_streaming_api
+    Rails.logger.info(streaming_channel)
+    Rails.logger.info(subscribed_to_timeline?)
+
+    return if destroyed? || !subscribed_to_timeline?
+
+    PushEncryptedMessageWorker.perform_async(id)
+  end
+
+  def subscribed_to_timeline?
+    Redis.current.exists("subscribed:#{streaming_channel}")
+  end
+
+  def streaming_channel
+    "timeline:#{device.account_id}:#{device.device_id}"
+  end
+end
diff --git a/app/models/message_franking.rb b/app/models/message_franking.rb
new file mode 100644
index 000000000..c72bd1cca
--- /dev/null
+++ b/app/models/message_franking.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class MessageFranking
+  attr_reader :hmac, :source_account_id, :target_account_id,
+              :timestamp, :original_franking
+
+  def initialize(attributes = {})
+    @hmac              = attributes[:hmac]
+    @source_account_id = attributes[:source_account_id]
+    @target_account_id = attributes[:target_account_id]
+    @timestamp         = attributes[:timestamp]
+    @original_franking = attributes[:original_franking]
+  end
+
+  def to_token
+    crypt = ActiveSupport::MessageEncryptor.new(SystemKey.current_key, serializer: Oj)
+    crypt.encrypt_and_sign(self)
+  end
+end
diff --git a/app/models/one_time_key.rb b/app/models/one_time_key.rb
new file mode 100644
index 000000000..8ada34824
--- /dev/null
+++ b/app/models/one_time_key.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: one_time_keys
+#
+#  id         :bigint(8)        not null, primary key
+#  device_id  :bigint(8)
+#  key_id     :string           default(""), not null
+#  key        :text             default(""), not null
+#  signature  :text             default(""), not null
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+
+class OneTimeKey < ApplicationRecord
+  belongs_to :device
+
+  validates :key_id, :key, :signature, presence: true
+  validates :key, ed25519_key: true
+  validates :signature, ed25519_signature: { message: :key, verify_key: ->(one_time_key) { one_time_key.device.fingerprint_key } }
+end
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index 2802f4667..235928260 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -23,19 +23,25 @@
 #  updated_at                   :datetime         not null
 #  embed_url                    :string           default(""), not null
 #  image_storage_schema_version :integer
+#  blurhash                     :string
 #
 
 class PreviewCard < ApplicationRecord
   IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
   LIMIT = 1.megabytes
 
+  BLURHASH_OPTIONS = {
+    x_comp: 4,
+    y_comp: 4,
+  }.freeze
+
   self.inheritance_column = false
 
   enum type: [:link, :photo, :video, :rich]
 
   has_and_belongs_to_many :statuses
 
-  has_attached_file :image, styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 80 -strip' }
+  has_attached_file :image, processors: [:thumbnail, :blurhash_transcoder], styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 80 -strip' }
 
   include Attachmentable
 
@@ -72,6 +78,7 @@ class PreviewCard < ApplicationRecord
           geometry: '400x400>',
           file_geometry_parser: FastGeometryParser,
           convert_options: '-coalesce -strip',
+          blurhash: BLURHASH_OPTIONS,
         },
       }
 
diff --git a/app/models/system_key.rb b/app/models/system_key.rb
new file mode 100644
index 000000000..f17db7c2d
--- /dev/null
+++ b/app/models/system_key.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: system_keys
+#
+#  id         :bigint(8)        not null, primary key
+#  key        :binary
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+class SystemKey < ApplicationRecord
+  ROTATION_PERIOD = 1.week.freeze
+
+  before_validation :set_key
+
+  scope :expired, ->(now = Time.now.utc) { where(arel_table[:created_at].lt(now - ROTATION_PERIOD * 3)) }
+
+  class << self
+    def current_key
+      previous_key = order(id: :asc).last
+
+      if previous_key && previous_key.created_at >= ROTATION_PERIOD.ago
+        previous_key.key
+      else
+        create.key
+      end
+    end
+  end
+
+  private
+
+  def set_key
+    return if key.present?
+
+    cipher = OpenSSL::Cipher.new('AES-256-GCM')
+    cipher.encrypt
+
+    self.key = cipher.random_key
+  end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index c8dbd2fd3..a05d98d88 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -38,6 +38,8 @@
 #  chosen_languages          :string           is an Array
 #  created_by_application_id :bigint(8)
 #  approved                  :boolean          default(TRUE), not null
+#  sign_in_token             :string
+#  sign_in_token_sent_at     :datetime
 #
 
 class User < ApplicationRecord
@@ -114,7 +116,7 @@ class User < ApplicationRecord
            :default_content_type, :system_emoji_font,
            to: :settings, prefix: :setting, allow_nil: false
 
-  attr_reader :invite_code
+  attr_reader :invite_code, :sign_in_token_attempt
   attr_writer :external
 
   def confirmed?
@@ -168,6 +170,10 @@ class User < ApplicationRecord
     true
   end
 
+  def suspicious_sign_in?(ip)
+    !otp_required_for_login? && current_sign_in_at.present? && current_sign_in_at < 2.weeks.ago && !recent_ip?(ip)
+  end
+
   def functional?
     confirmed? && approved? && !disabled? && !account.suspended?
   end
@@ -270,6 +276,13 @@ class User < ApplicationRecord
     super
   end
 
+  def external_or_valid_password?(compare_password)
+    # If encrypted_password is blank, we got the user from LDAP or PAM,
+    # so credentials are already valid
+
+    encrypted_password.blank? || valid_password?(compare_password)
+  end
+
   def send_reset_password_instructions
     return false if encrypted_password.blank?
 
@@ -305,6 +318,15 @@ class User < ApplicationRecord
     end
   end
 
+  def sign_in_token_expired?
+    sign_in_token_sent_at.nil? || sign_in_token_sent_at < 5.minutes.ago
+  end
+
+  def generate_sign_in_token
+    self.sign_in_token         = Devise.friendly_token(6)
+    self.sign_in_token_sent_at = Time.now.utc
+  end
+
   protected
 
   def send_devise_notification(notification, *args)
@@ -321,6 +343,10 @@ class User < ApplicationRecord
 
   private
 
+  def recent_ip?(ip)
+    recent_ips.any? { |(_, recent_ip)| recent_ip == ip }
+  end
+
   def send_pending_devise_notifications
     pending_devise_notifications.each do |notification, args|
       render_and_send_devise_message(notification, *args)
diff --git a/app/presenters/activitypub/activity_presenter.rb b/app/presenters/activitypub/activity_presenter.rb
new file mode 100644
index 000000000..5d174767f
--- /dev/null
+++ b/app/presenters/activitypub/activity_presenter.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+class ActivityPub::ActivityPresenter < ActiveModelSerializers::Model
+  attributes :id, :type, :actor, :published, :to, :cc, :virtual_object
+
+  class << self
+    def from_status(status)
+      new.tap do |presenter|
+        presenter.id        = ActivityPub::TagManager.instance.activity_uri_for(status)
+        presenter.type      = status.reblog? ? 'Announce' : 'Create'
+        presenter.actor     = ActivityPub::TagManager.instance.uri_for(status.account)
+        presenter.published = status.created_at
+        presenter.to        = ActivityPub::TagManager.instance.to(status)
+        presenter.cc        = ActivityPub::TagManager.instance.cc(status)
+
+        presenter.virtual_object = begin
+          if status.reblog?
+            if status.account == status.proper.account && status.proper.private_visibility? && status.local?
+              status.proper
+            else
+              ActivityPub::TagManager.instance.uri_for(status.proper)
+            end
+          else
+            status.proper
+          end
+        end
+      end
+    end
+
+    def from_encrypted_message(encrypted_message)
+      new.tap do |presenter|
+        presenter.id = ActivityPub::TagManager.instance.generate_uri_for(nil)
+        presenter.type = 'Create'
+        presenter.actor = ActivityPub::TagManager.instance.uri_for(encrypted_message.source_account)
+        presenter.published = Time.now.utc
+        presenter.to = ActivityPub::TagManager.instance.uri_for(encrypted_message.target_account)
+        presenter.virtual_object = encrypted_message
+      end
+    end
+  end
+end
diff --git a/app/presenters/initial_state_presenter.rb b/app/presenters/initial_state_presenter.rb
index 70c496be8..06482935c 100644
--- a/app/presenters/initial_state_presenter.rb
+++ b/app/presenters/initial_state_presenter.rb
@@ -2,5 +2,5 @@
 
 class InitialStatePresenter < ActiveModelSerializers::Model
   attributes :settings, :push_subscription, :token,
-             :current_account, :admin, :text
+             :current_account, :admin, :text, :visibility
 end
diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index d0edad786..5bdf53f03 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -1,52 +1,22 @@
 # frozen_string_literal: true
 
 class ActivityPub::ActivitySerializer < ActivityPub::Serializer
-  attributes :id, :type, :actor, :published, :to, :cc
-
-  has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, if: :serialize_object?
-
-  attribute :proper_uri, key: :object, unless: :serialize_object?
-  attribute :atom_uri, if: :announce?
-
-  def id
-    ActivityPub::TagManager.instance.activity_uri_for(object)
+  def self.serializer_for(model, options)
+    case model.class.name
+    when 'Status'
+      ActivityPub::NoteSerializer
+    when 'DeliverToDeviceService::EncryptedMessage'
+      ActivityPub::EncryptedMessageSerializer
+    else
+      super
+    end
   end
 
-  def type
-    announce? ? 'Announce' : 'Create'
-  end
+  attributes :id, :type, :actor, :published, :to, :cc
 
-  def actor
-    ActivityPub::TagManager.instance.uri_for(object.account)
-  end
+  has_one :virtual_object, key: :object
 
   def published
-    object.created_at.iso8601
-  end
-
-  def to
-    ActivityPub::TagManager.instance.to(object)
-  end
-
-  def cc
-    ActivityPub::TagManager.instance.cc(object)
-  end
-
-  def proper_uri
-    ActivityPub::TagManager.instance.uri_for(object.proper)
-  end
-
-  def atom_uri
-    OStatus::TagManager.instance.uri_for(object)
-  end
-
-  def announce?
-    object.reblog?
-  end
-
-  def serialize_object?
-    return true unless announce?
-    # Serialize private self-boosts of local toots
-    object.account == object.proper.account && object.proper.private_visibility? && object.local?
+    object.published.iso8601
   end
 end
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index aa64936a7..627d4446b 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -7,7 +7,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
 
   context_extensions :manually_approves_followers, :featured, :also_known_as,
                      :moved_to, :property_value, :identity_proof,
-                     :discoverable
+                     :discoverable, :olm
 
   attributes :id, :type, :following, :followers,
              :inbox, :outbox, :featured,
@@ -20,6 +20,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
   has_many :virtual_tags, key: :tag
   has_many :virtual_attachments, key: :attachment
 
+  attribute :devices, unless: :instance_actor?
   attribute :moved_to, if: :moved?
   attribute :also_known_as, if: :also_known_as?
 
@@ -38,7 +39,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
   has_one :icon,  serializer: ActivityPub::ImageSerializer, if: :avatar_exists?
   has_one :image, serializer: ActivityPub::ImageSerializer, if: :header_exists?
 
-  delegate :moved?, to: :object
+  delegate :moved?, :instance_actor?, to: :object
 
   def id
     object.instance_actor? ? instance_actor_url : account_url(object)
@@ -68,6 +69,10 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
     object.instance_actor? ? instance_actor_inbox_url : account_inbox_url(object)
   end
 
+  def devices
+    account_collection_url(object, :devices)
+  end
+
   def outbox
     account_outbox_url(object)
   end
diff --git a/app/serializers/activitypub/collection_serializer.rb b/app/serializers/activitypub/collection_serializer.rb
index da1ba735f..ea7af5433 100644
--- a/app/serializers/activitypub/collection_serializer.rb
+++ b/app/serializers/activitypub/collection_serializer.rb
@@ -1,10 +1,28 @@
 # frozen_string_literal: true
 
 class ActivityPub::CollectionSerializer < ActivityPub::Serializer
+  class StringSerializer < ActiveModel::Serializer
+    # Despite the name, it does not return a hash, but the same can be said of
+    # the ActiveModel::Serializer::CollectionSerializer class which handles
+    # arrays.
+    def serializable_hash(*_args)
+      object
+    end
+  end
+
   def self.serializer_for(model, options)
-    return ActivityPub::NoteSerializer if model.class.name == 'Status'
-    return ActivityPub::CollectionSerializer if model.class.name == 'ActivityPub::CollectionPresenter'
-    super
+    case model.class.name
+    when 'Status'
+      ActivityPub::NoteSerializer
+    when 'Device'
+      ActivityPub::DeviceSerializer
+    when 'ActivityPub::CollectionPresenter'
+      ActivityPub::CollectionSerializer
+    when 'String'
+      StringSerializer
+    else
+      super
+    end
   end
 
   attribute :id, if: -> { object.id.present? }
diff --git a/app/serializers/activitypub/device_serializer.rb b/app/serializers/activitypub/device_serializer.rb
new file mode 100644
index 000000000..5f0fdc8af
--- /dev/null
+++ b/app/serializers/activitypub/device_serializer.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+class ActivityPub::DeviceSerializer < ActivityPub::Serializer
+  context_extensions :olm
+
+  include RoutingHelper
+
+  class FingerprintKeySerializer < ActivityPub::Serializer
+    attributes :type, :public_key_base64
+
+    def type
+      'Ed25519Key'
+    end
+
+    def public_key_base64
+      object.fingerprint_key
+    end
+  end
+
+  class IdentityKeySerializer < ActivityPub::Serializer
+    attributes :type, :public_key_base64
+
+    def type
+      'Curve25519Key'
+    end
+
+    def public_key_base64
+      object.identity_key
+    end
+  end
+
+  attributes :device_id, :type, :name, :claim
+
+  has_one :fingerprint_key, serializer: FingerprintKeySerializer
+  has_one :identity_key, serializer: IdentityKeySerializer
+
+  def type
+    'Device'
+  end
+
+  def claim
+    account_claim_url(object.account, id: object.device_id)
+  end
+
+  def fingerprint_key
+    object
+  end
+
+  def identity_key
+    object
+  end
+end
diff --git a/app/serializers/activitypub/encrypted_message_serializer.rb b/app/serializers/activitypub/encrypted_message_serializer.rb
new file mode 100644
index 000000000..3c525d23e
--- /dev/null
+++ b/app/serializers/activitypub/encrypted_message_serializer.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+class ActivityPub::EncryptedMessageSerializer < ActivityPub::Serializer
+  context :security
+
+  context_extensions :olm
+
+  class DeviceSerializer < ActivityPub::Serializer
+    attributes :type, :device_id
+
+    def type
+      'Device'
+    end
+
+    def device_id
+      object
+    end
+  end
+
+  class DigestSerializer < ActivityPub::Serializer
+    attributes :type, :digest_algorithm, :digest_value
+
+    def type
+      'Digest'
+    end
+
+    def digest_algorithm
+      'http://www.w3.org/2000/09/xmldsig#hmac-sha256'
+    end
+
+    def digest_value
+      object
+    end
+  end
+
+  attributes :type, :message_type, :cipher_text, :message_franking
+
+  has_one :attributed_to, serializer: DeviceSerializer
+  has_one :to, serializer: DeviceSerializer
+  has_one :digest, serializer: DigestSerializer
+
+  def type
+    'EncryptedMessage'
+  end
+
+  def attributed_to
+    object.source_device.device_id
+  end
+
+  def to
+    object.target_device_id
+  end
+
+  def message_type
+    object.type
+  end
+
+  def cipher_text
+    object.body
+  end
+end
diff --git a/app/serializers/activitypub/one_time_key_serializer.rb b/app/serializers/activitypub/one_time_key_serializer.rb
new file mode 100644
index 000000000..5932eb5b5
--- /dev/null
+++ b/app/serializers/activitypub/one_time_key_serializer.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class ActivityPub::OneTimeKeySerializer < ActivityPub::Serializer
+  context :security
+
+  context_extensions :olm
+
+  class SignatureSerializer < ActivityPub::Serializer
+    attributes :type, :signature_value
+
+    def type
+      'Ed25519Signature'
+    end
+
+    def signature_value
+      object.signature
+    end
+  end
+
+  attributes :key_id, :type, :public_key_base64
+
+  has_one :signature, serializer: SignatureSerializer
+
+  def type
+    'Curve25519Key'
+  end
+
+  def public_key_base64
+    object.key
+  end
+
+  def signature
+    object
+  end
+end
diff --git a/app/serializers/activitypub/outbox_serializer.rb b/app/serializers/activitypub/outbox_serializer.rb
index 48fbad0fd..4f4f950a5 100644
--- a/app/serializers/activitypub/outbox_serializer.rb
+++ b/app/serializers/activitypub/outbox_serializer.rb
@@ -2,7 +2,14 @@
 
 class ActivityPub::OutboxSerializer < ActivityPub::CollectionSerializer
   def self.serializer_for(model, options)
-    return ActivityPub::ActivitySerializer if model.is_a?(Status)
-    super
+    if model.class.name == 'ActivityPub::ActivityPresenter'
+      ActivityPub::ActivitySerializer
+    else
+      super
+    end
+  end
+
+  def items
+    object.items.map { |status| ActivityPub::ActivityPresenter.from_status(status) }
   end
 end
diff --git a/app/serializers/activitypub/undo_announce_serializer.rb b/app/serializers/activitypub/undo_announce_serializer.rb
index 6758af679..a925efc18 100644
--- a/app/serializers/activitypub/undo_announce_serializer.rb
+++ b/app/serializers/activitypub/undo_announce_serializer.rb
@@ -3,7 +3,7 @@
 class ActivityPub::UndoAnnounceSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :to
 
-  has_one :object, serializer: ActivityPub::ActivitySerializer
+  has_one :virtual_object, key: :object, serializer: ActivityPub::ActivitySerializer
 
   def id
     [ActivityPub::TagManager.instance.uri_for(object.account), '#announces/', object.id, '/undo'].join
@@ -20,4 +20,8 @@ class ActivityPub::UndoAnnounceSerializer < ActivityPub::Serializer
   def to
     [ActivityPub::TagManager::COLLECTIONS[:public]]
   end
+
+  def virtual_object
+    ActivityPub::ActivityPresenter.from_status(object)
+  end
 end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index e5e88c200..c520c9bcb 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -72,7 +72,7 @@ class InitialStateSerializer < ActiveModel::Serializer
 
     if object.current_account
       store[:me]                = object.current_account.id.to_s
-      store[:default_privacy]   = object.current_account.user.setting_default_privacy
+      store[:default_privacy]   = object.visibility || object.current_account.user.setting_default_privacy
       store[:default_sensitive] = object.current_account.user.setting_default_sensitive
     end
 
diff --git a/app/serializers/rest/encrypted_message_serializer.rb b/app/serializers/rest/encrypted_message_serializer.rb
new file mode 100644
index 000000000..80c26d060
--- /dev/null
+++ b/app/serializers/rest/encrypted_message_serializer.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class REST::EncryptedMessageSerializer < ActiveModel::Serializer
+  attributes :id, :account_id, :device_id,
+             :type, :body, :digest, :message_franking,
+             :created_at
+
+  def id
+    object.id.to_s
+  end
+
+  def account_id
+    object.from_account_id.to_s
+  end
+
+  def device_id
+    object.from_device_id
+  end
+end
diff --git a/app/serializers/rest/keys/claim_result_serializer.rb b/app/serializers/rest/keys/claim_result_serializer.rb
new file mode 100644
index 000000000..145044f55
--- /dev/null
+++ b/app/serializers/rest/keys/claim_result_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class REST::Keys::ClaimResultSerializer < ActiveModel::Serializer
+  attributes :account_id, :device_id, :key_id, :key, :signature
+
+  def account_id
+    object.account.id.to_s
+  end
+end
diff --git a/app/serializers/rest/keys/device_serializer.rb b/app/serializers/rest/keys/device_serializer.rb
new file mode 100644
index 000000000..f9b821b79
--- /dev/null
+++ b/app/serializers/rest/keys/device_serializer.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class REST::Keys::DeviceSerializer < ActiveModel::Serializer
+  attributes :device_id, :name, :identity_key,
+             :fingerprint_key
+end
diff --git a/app/serializers/rest/keys/query_result_serializer.rb b/app/serializers/rest/keys/query_result_serializer.rb
new file mode 100644
index 000000000..8f8bdde28
--- /dev/null
+++ b/app/serializers/rest/keys/query_result_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class REST::Keys::QueryResultSerializer < ActiveModel::Serializer
+  attributes :account_id
+
+  has_many :devices, serializer: REST::Keys::DeviceSerializer
+
+  def account_id
+    object.account.id.to_s
+  end
+end
diff --git a/app/serializers/rest/preview_card_serializer.rb b/app/serializers/rest/preview_card_serializer.rb
index 2df9d07a7..66ff47d22 100644
--- a/app/serializers/rest/preview_card_serializer.rb
+++ b/app/serializers/rest/preview_card_serializer.rb
@@ -6,7 +6,7 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer
   attributes :url, :title, :description, :type,
              :author_name, :author_url, :provider_name,
              :provider_url, :html, :width, :height,
-             :image, :embed_url
+             :image, :embed_url, :blurhash
 
   def image
     object.image? ? full_asset_url(object.image.url(:original)) : nil
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 7b4c53d50..f4276cece 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -76,6 +76,7 @@ class ActivityPub::ProcessAccountService < BaseService
     @account.shared_inbox_url        = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || ''
     @account.followers_url           = @json['followers'] || ''
     @account.featured_collection_url = @json['featured'] || ''
+    @account.devices_url             = @json['devices'] || ''
     @account.url                     = url || @uri
     @account.uri                     = @uri
     @account.display_name            = @json['name'] || ''
diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb
index 989fd6784..749c84736 100644
--- a/app/services/backup_service.rb
+++ b/app/services/backup_service.rb
@@ -22,7 +22,7 @@ class BackupService < BaseService
 
     account.statuses.with_includes.reorder(nil).find_in_batches do |statuses|
       statuses.each do |status|
-        item = serialize_payload(status, ActivityPub::ActivitySerializer, signer: @account, allow_local_only: true)
+        item = serialize_payload(ActivityPub::ActivityPresenter.from_status(status), ActivityPub::ActivitySerializer, signer: @account, allow_local_only: true)
         item.delete(:'@context')
 
         unless item[:type] == 'Announce' || item[:object][:attachment].blank?
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index 9f0860674..dc23ef8d8 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -26,59 +26,20 @@ class BlockDomainService < BaseService
       suspend_accounts!
     end
 
-    clear_media! if domain_block.reject_media?
-  end
-
-  def invalidate_association_caches!
-    # Normally, associated models of a status are immutable (except for accounts)
-    # so they are aggressively cached. After updating the media attachments to no
-    # longer point to a local file, we need to clear the cache to make those
-    # changes appear in the API and UI
-    @affected_status_ids.each { |id| Rails.cache.delete_matched("statuses/#{id}-*") }
+    DomainClearMediaWorker.perform_async(domain_block.id) if domain_block.reject_media?
   end
 
   def silence_accounts!
     blocked_domain_accounts.without_silenced.in_batches.update_all(silenced_at: @domain_block.created_at)
   end
 
-  def clear_media!
-    @affected_status_ids = []
-
-    clear_account_images!
-    clear_account_attachments!
-    clear_emojos!
-
-    invalidate_association_caches!
-  end
-
   def suspend_accounts!
-    blocked_domain_accounts.without_suspended.reorder(nil).find_each do |account|
+    blocked_domain_accounts.without_suspended.in_batches.update_all(suspended_at: @domain_block.created_at)
+    blocked_domain_accounts.where(suspended_at: @domain_block.created_at).reorder(nil).find_each do |account|
       SuspendAccountService.new.call(account, reserve_username: true, suspended_at: @domain_block.created_at)
     end
   end
 
-  def clear_account_images!
-    blocked_domain_accounts.reorder(nil).find_each do |account|
-      account.avatar.destroy if account.avatar.exists?
-      account.header.destroy if account.header.exists?
-      account.save
-    end
-  end
-
-  def clear_account_attachments!
-    media_from_blocked_domain.reorder(nil).find_each do |attachment|
-      @affected_status_ids << attachment.status_id if attachment.status_id.present?
-
-      attachment.file.destroy if attachment.file.exists?
-      attachment.type = :unknown
-      attachment.save
-    end
-  end
-
-  def clear_emojos!
-    emojis_from_blocked_domains.destroy_all
-  end
-
   def blocked_domain
     domain_block.domain
   end
@@ -86,12 +47,4 @@ class BlockDomainService < BaseService
   def blocked_domain_accounts
     Account.by_domain_and_subdomains(blocked_domain)
   end
-
-  def media_from_blocked_domain
-    MediaAttachment.joins(:account).merge(blocked_domain_accounts).reorder(nil)
-  end
-
-  def emojis_from_blocked_domains
-    CustomEmoji.by_domain_and_subdomains(blocked_domain)
-  end
 end
diff --git a/app/services/clear_domain_media_service.rb b/app/services/clear_domain_media_service.rb
new file mode 100644
index 000000000..704cfb71a
--- /dev/null
+++ b/app/services/clear_domain_media_service.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+class ClearDomainMediaService < BaseService
+  attr_reader :domain_block
+
+  def call(domain_block)
+    @domain_block = domain_block
+    clear_media! if domain_block.reject_media?
+  end
+
+  private
+
+  def invalidate_association_caches!
+    # Normally, associated models of a status are immutable (except for accounts)
+    # so they are aggressively cached. After updating the media attachments to no
+    # longer point to a local file, we need to clear the cache to make those
+    # changes appear in the API and UI
+    @affected_status_ids.each { |id| Rails.cache.delete_matched("statuses/#{id}-*") }
+  end
+
+  def clear_media!
+    @affected_status_ids = []
+
+    begin
+      clear_account_images!
+      clear_account_attachments!
+      clear_emojos!
+    ensure
+      invalidate_association_caches!
+    end
+  end
+
+  def clear_account_images!
+    blocked_domain_accounts.reorder(nil).find_each do |account|
+      account.avatar.destroy if account.avatar&.exists?
+      account.header.destroy if account.header&.exists?
+      account.save
+    end
+  end
+
+  def clear_account_attachments!
+    media_from_blocked_domain.reorder(nil).find_each do |attachment|
+      @affected_status_ids << attachment.status_id if attachment.status_id.present?
+
+      attachment.file.destroy if attachment.file&.exists?
+      attachment.type = :unknown
+      attachment.save
+    end
+  end
+
+  def clear_emojos!
+    emojis_from_blocked_domains.destroy_all
+  end
+
+  def blocked_domain
+    domain_block.domain
+  end
+
+  def blocked_domain_accounts
+    Account.by_domain_and_subdomains(blocked_domain)
+  end
+
+  def media_from_blocked_domain
+    MediaAttachment.joins(:account).merge(blocked_domain_accounts).reorder(nil)
+  end
+
+  def emojis_from_blocked_domains
+    CustomEmoji.by_domain_and_subdomains(blocked_domain)
+  end
+end
diff --git a/app/services/concerns/payloadable.rb b/app/services/concerns/payloadable.rb
index 7f9f21c4b..3e45570c3 100644
--- a/app/services/concerns/payloadable.rb
+++ b/app/services/concerns/payloadable.rb
@@ -5,8 +5,9 @@ module Payloadable
     signer    = options.delete(:signer)
     sign_with = options.delete(:sign_with)
     payload   = ActiveModelSerializers::SerializableResource.new(record, options.merge(serializer: serializer, adapter: ActivityPub::Adapter)).as_json
+    object    = record.respond_to?(:virtual_object) ? record.virtual_object : record
 
-    if (record.respond_to?(:sign?) && record.sign?) && signer && signing_enabled?
+    if (object.respond_to?(:sign?) && object.sign?) && signer && signing_enabled?
       ActivityPub::LinkedDataSignature.new(payload).sign!(signer, sign_with: sign_with)
     else
       payload
diff --git a/app/services/deliver_to_device_service.rb b/app/services/deliver_to_device_service.rb
new file mode 100644
index 000000000..71711945c
--- /dev/null
+++ b/app/services/deliver_to_device_service.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+class DeliverToDeviceService < BaseService
+  include Payloadable
+
+  class EncryptedMessage < ActiveModelSerializers::Model
+    attributes :source_account, :target_account, :source_device,
+               :target_device_id, :type, :body, :digest,
+               :message_franking
+  end
+
+  def call(source_account, source_device, options = {})
+    @source_account   = source_account
+    @source_device    = source_device
+    @target_account   = Account.find(options[:account_id])
+    @target_device_id = options[:device_id]
+    @body             = options[:body]
+    @type             = options[:type]
+    @hmac             = options[:hmac]
+
+    set_message_franking!
+
+    if @target_account.local?
+      deliver_to_local!
+    else
+      deliver_to_remote!
+    end
+  end
+
+  private
+
+  def set_message_franking!
+    @message_franking = message_franking.to_token
+  end
+
+  def deliver_to_local!
+    target_device = @target_account.devices.find_by!(device_id: @target_device_id)
+
+    target_device.encrypted_messages.create!(
+      from_account: @source_account,
+      from_device_id: @source_device.device_id,
+      type: @type,
+      body: @body,
+      digest: @hmac,
+      message_franking: @message_franking
+    )
+  end
+
+  def deliver_to_remote!
+    ActivityPub::DeliveryWorker.perform_async(
+      Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_encrypted_message(encrypted_message), ActivityPub::ActivitySerializer)),
+      @source_account.id,
+      @target_account.inbox_url
+    )
+  end
+
+  def message_franking
+    MessageFranking.new(
+      source_account_id: @source_account.id,
+      target_account_id: @target_account.id,
+      hmac: @hmac,
+      timestamp: Time.now.utc
+    )
+  end
+
+  def encrypted_message
+    EncryptedMessage.new(
+      source_account: @source_account,
+      target_account: @target_account,
+      source_device: @source_device,
+      target_device_id: @target_device_id,
+      type: @type,
+      body: @body,
+      digest: @hmac,
+      message_franking: @message_franking
+    )
+  end
+end
diff --git a/app/services/import_service.rb b/app/services/import_service.rb
index c0d741d57..4cad93767 100644
--- a/app/services/import_service.rb
+++ b/app/services/import_service.rb
@@ -81,7 +81,9 @@ class ImportService < BaseService
       end
     end
 
-    Import::RelationshipWorker.push_bulk(items) do |acct, extra|
+    head_items = items.uniq { |acct, _| acct.split('@')[1] }
+    tail_items = items - head_items
+    Import::RelationshipWorker.push_bulk(head_items + tail_items) do |acct, extra|
       [@account.id, acct, action, extra]
     end
   end
diff --git a/app/services/keys/claim_service.rb b/app/services/keys/claim_service.rb
new file mode 100644
index 000000000..672119130
--- /dev/null
+++ b/app/services/keys/claim_service.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+class Keys::ClaimService < BaseService
+  HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze
+
+  class Result < ActiveModelSerializers::Model
+    attributes :account, :device_id, :key_id,
+               :key, :signature
+
+    def initialize(account, device_id, key_attributes = {})
+      @account   = account
+      @device_id = device_id
+      @key_id    = key_attributes[:key_id]
+      @key       = key_attributes[:key]
+      @signature = key_attributes[:signature]
+    end
+  end
+
+  def call(source_account, target_account_id, device_id)
+    @source_account = source_account
+    @target_account = Account.find(target_account_id)
+    @device_id      = device_id
+
+    if @target_account.local?
+      claim_local_key!
+    else
+      claim_remote_key!
+    end
+  rescue ActiveRecord::RecordNotFound
+    nil
+  end
+
+  private
+
+  def claim_local_key!
+    device = @target_account.devices.find_by(device_id: @device_id)
+    key    = nil
+
+    ApplicationRecord.transaction do
+      key = device.one_time_keys.order(Arel.sql('random()')).first!
+      key.destroy!
+    end
+
+    @result = Result.new(@target_account, @device_id, key)
+  end
+
+  def claim_remote_key!
+    query_result = QueryService.new.call(@target_account)
+    device       = query_result.find(@device_id)
+
+    return unless device.present? && device.valid_claim_url?
+
+    json = fetch_resource_with_post(device.claim_url)
+
+    return unless json.present? && json['publicKeyBase64'].present?
+
+    @result = Result.new(@target_account, @device_id, key_id: json['id'], key: json['publicKeyBase64'], signature: json.dig('signature', 'signatureValue'))
+  rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error => e
+    Rails.logger.debug "Claiming one-time key for #{@target_account.acct}:#{@device_id} failed: #{e}"
+    nil
+  end
+
+  def fetch_resource_with_post(uri)
+    build_post_request(uri).perform do |response|
+      raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response)
+
+      body_to_json(response.body_with_limit) if response.code == 200
+    end
+  end
+
+  def build_post_request(uri)
+    Request.new(:post, uri).tap do |request|
+      request.on_behalf_of(@source_account, :uri)
+      request.add_headers(HEADERS)
+    end
+  end
+end
diff --git a/app/services/keys/query_service.rb b/app/services/keys/query_service.rb
new file mode 100644
index 000000000..286fbd834
--- /dev/null
+++ b/app/services/keys/query_service.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+class Keys::QueryService < BaseService
+  include JsonLdHelper
+
+  class Result < ActiveModelSerializers::Model
+    attributes :account, :devices
+
+    def initialize(account, devices)
+      @account = account
+      @devices = devices || []
+    end
+
+    def find(device_id)
+      @devices.find { |device| device.device_id == device_id }
+    end
+  end
+
+  class Device < ActiveModelSerializers::Model
+    attributes :device_id, :name, :identity_key, :fingerprint_key
+
+    def initialize(attributes = {})
+      @device_id       = attributes[:device_id]
+      @name            = attributes[:name]
+      @identity_key    = attributes[:identity_key]
+      @fingerprint_key = attributes[:fingerprint_key]
+      @claim_url       = attributes[:claim_url]
+    end
+
+    def valid_claim_url?
+      return false if @claim_url.blank?
+
+      begin
+        parsed_url = Addressable::URI.parse(@claim_url).normalize
+      rescue Addressable::URI::InvalidURIError
+        return false
+      end
+
+      %w(http https).include?(parsed_url.scheme) && parsed_url.host.present?
+    end
+  end
+
+  def call(account)
+    @account = account
+
+    if @account.local?
+      query_local_devices!
+    else
+      query_remote_devices!
+    end
+
+    Result.new(@account, @devices)
+  end
+
+  private
+
+  def query_local_devices!
+    @devices = @account.devices.map { |device| Device.new(device) }
+  end
+
+  def query_remote_devices!
+    return if @account.devices_url.blank?
+
+    json = fetch_resource(@account.devices_url)
+
+    return if json['items'].blank?
+
+    @devices = json['items'].map do |device|
+      Device.new(device_id: device['id'], name: device['name'], identity_key: device.dig('identityKey', 'publicKeyBase64'), fingerprint_key: device.dig('fingerprintKey', 'publicKeyBase64'), claim_url: device['claim'])
+    end
+  rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error => e
+    Rails.logger.debug "Querying devices for #{@account.acct} failed: #{e}"
+    nil
+  end
+end
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 3c257451c..65a3f64b8 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -65,7 +65,7 @@ class ProcessMentionsService < BaseService
 
   def activitypub_json
     return @activitypub_json if defined?(@activitypub_json)
-    @activitypub_json = Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @status.account))
+    @activitypub_json = Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @status.account))
   end
 
   def resolve_account_service
diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb
index 0a46509f8..6cecb5ac4 100644
--- a/app/services/reblog_service.rb
+++ b/app/services/reblog_service.rb
@@ -60,6 +60,6 @@ class ReblogService < BaseService
   end
 
   def build_json(reblog)
-    Oj.dump(serialize_payload(reblog, ActivityPub::ActivitySerializer, signer: reblog.account))
+    Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(reblog), ActivityPub::ActivitySerializer, signer: reblog.account))
   end
 end
diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb
index 17ace100c..ba77552c6 100644
--- a/app/services/resolve_account_service.rb
+++ b/app/services/resolve_account_service.rb
@@ -112,6 +112,8 @@ class ResolveAccountService < BaseService
   end
 
   def webfinger_update_due?
+    return false if @options[:check_delivery_availability] && !DeliveryFailureTracker.available?(@domain)
+
     @account.nil? || ((!@options[:skip_webfinger] || @account.ostatus?) && @account.possibly_stale?)
   end
 
diff --git a/app/validators/ed25519_key_validator.rb b/app/validators/ed25519_key_validator.rb
new file mode 100644
index 000000000..00a448d5a
--- /dev/null
+++ b/app/validators/ed25519_key_validator.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Ed25519KeyValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if value.blank?
+
+    key = Base64.decode64(value)
+
+    record.errors[attribute] << I18n.t('crypto.errors.invalid_key') unless verified?(key)
+  end
+
+  private
+
+  def verified?(key)
+    Ed25519.validate_key_bytes(key)
+  rescue ArgumentError
+    false
+  end
+end
diff --git a/app/validators/ed25519_signature_validator.rb b/app/validators/ed25519_signature_validator.rb
new file mode 100644
index 000000000..77a21b837
--- /dev/null
+++ b/app/validators/ed25519_signature_validator.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class Ed25519SignatureValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if value.blank?
+
+    verify_key = Ed25519::VerifyKey.new(Base64.decode64(option_to_value(record, :verify_key)))
+    signature  = Base64.decode64(value)
+    message    = option_to_value(record, :message)
+
+    record.errors[attribute] << I18n.t('crypto.errors.invalid_signature') unless verified?(verify_key, signature, message)
+  end
+
+  private
+
+  def verified?(verify_key, signature, message)
+    verify_key.verify(signature, message)
+  rescue Ed25519::VerifyError, ArgumentError
+    false
+  end
+
+  def option_to_value(record, key)
+    if options[key].is_a?(Proc)
+      options[key].call(record)
+    else
+      record.public_send(options[key])
+    end
+  end
+end
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index 03be3f423..0a12ab8d6 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -55,12 +55,15 @@
             %p= t('about.unavailable_content_html')
 
             - if (blocks = @blocks.select(&:reject_media?)) && !blocks.empty?
+              %h3= t('about.unavailable_content_description.rejecting_media_title')
               %p= t('about.unavailable_content_description.rejecting_media')
               = render partial: 'domain_blocks', locals: { domain_blocks: blocks }
             - if (blocks = @blocks.select(&:silence?)) && !blocks.empty?
+              %h3= t('about.unavailable_content_description.silenced_title')
               %p= t('about.unavailable_content_description.silenced')
               = render partial: 'domain_blocks', locals: { domain_blocks: blocks }
             - if (blocks = @blocks.select(&:suspend?)) && !blocks.empty?
+              %h3= t('about.unavailable_content_description.suspended_title')
               %p= t('about.unavailable_content_description.suspended')
               = render partial: 'domain_blocks', locals: { domain_blocks: blocks }
 
diff --git a/app/views/admin/custom_emojis/index.html.haml b/app/views/admin/custom_emojis/index.html.haml
index d3705a36e..45cb7bee0 100644
--- a/app/views/admin/custom_emojis/index.html.haml
+++ b/app/views/admin/custom_emojis/index.html.haml
@@ -1,8 +1,9 @@
 - content_for :page_title do
   = t('admin.custom_emojis.title')
 
-- content_for :heading_actions do
-  = link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
+- if can?(:create, :custom_emoji)
+  - content_for :heading_actions do
+    = link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
 
 .filters
   .filter-subset
@@ -55,9 +56,10 @@
 
         = f.button safe_join([fa_icon('power-off'), t('admin.custom_emojis.disable')]), name: :disable, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
-        = f.button safe_join([fa_icon('times'), t('admin.custom_emojis.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
+        - if can?(:destroy, :custom_emoji)
+          = f.button safe_join([fa_icon('times'), t('admin.custom_emojis.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
-        - unless params[:local] == '1'
+        - if can?(:copy, :custom_emoji) && params[:local] != '1'
           = f.button safe_join([fa_icon('copy'), t('admin.custom_emojis.copy')]), name: :copy, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
     - if params[:local] == '1'
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index bd67eb4fc..a73b8dc92 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -1,6 +1,12 @@
 - content_for :page_title do
   = t('admin.instances.title')
 
+- content_for :heading_actions do
+  - if whitelist_mode?
+    = link_to t('admin.domain_allows.add_new'), new_admin_domain_allow_path, class: 'button'
+  - else
+    = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
+
 .filters
   .filter-subset
     %strong= t('admin.instances.moderation.title')
@@ -10,12 +16,6 @@
       - unless whitelist_mode?
         %li= filter_link_to t('admin.instances.moderation.limited'), limited: '1'
 
-  %div.special-action-button
-    - if whitelist_mode?
-      = link_to t('admin.domain_allows.add_new'), new_admin_domain_allow_path, class: 'button'
-    - else
-      = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
-
 - unless whitelist_mode?
   = form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
     .fields-group
diff --git a/app/views/auth/sessions/sign_in_token.html.haml b/app/views/auth/sessions/sign_in_token.html.haml
new file mode 100644
index 000000000..8923203cd
--- /dev/null
+++ b/app/views/auth/sessions/sign_in_token.html.haml
@@ -0,0 +1,14 @@
+- content_for :page_title do
+  = t('auth.login')
+
+= simple_form_for(resource, as: resource_name, url: session_path(resource_name), method: :post) do |f|
+  %p.hint.otp-hint= t('users.suspicious_sign_in_confirmation')
+
+  .fields-group
+    = f.input :sign_in_token_attempt, type: :number, wrapper: :with_label, label: t('simple_form.labels.defaults.sign_in_token_attempt'), input_html: { 'aria-label' => t('simple_form.labels.defaults.sign_in_token_attempt'), :autocomplete => 'off' }, autofocus: true
+
+  .actions
+    = f.button :button, t('auth.login'), type: :submit
+
+  - if Setting.site_contact_email.present?
+    %p.hint.subtle-hint= t('users.generic_access_help_html', email: mail_to(Setting.site_contact_email, nil))
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index 33b81c748..8e409846a 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -39,7 +39,7 @@
       = react_component :media_gallery, height: 380, sensitive: status.sensitive?, standalone: true, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
-    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
+    = react_component :card, sensitive: status.sensitive?, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   .detailed-status__meta
     %data.dt-published{ value: status.created_at.to_time.iso8601 }
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index b7a2b7116..7a0262c9d 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -43,7 +43,7 @@
       = react_component :media_gallery, height: 343, sensitive: status.sensitive?, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
-    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
+    = react_component :card, sensitive: status.sensitive?, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   - if !status.in_reply_to_id.nil? && status.in_reply_to_account_id == status.account.id
     = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__content__read-more-button', target: stream_link_target, rel: 'noopener noreferrer' do
diff --git a/app/views/user_mailer/sign_in_token.html.haml b/app/views/user_mailer/sign_in_token.html.haml
new file mode 100644
index 000000000..826b34e7c
--- /dev/null
+++ b/app/views/user_mailer/sign_in_token.html.haml
@@ -0,0 +1,105 @@
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.hero
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center.padded
+                              %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td
+                                      = image_tag full_pack_url('media/images/mailer/icon_email.png'), alt: ''
+
+                              %h1= t 'user_mailer.sign_in_token.title'
+                              %p.lead= t 'user_mailer.sign_in_token.explanation'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.content-start
+                  %table.column{ cellspacing: 0, cellpadding: 0 }
+                    %tbody
+                      %tr
+                        %td.column-cell.input-cell
+                          %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                            %tbody
+                              %tr
+                                %td= @resource.sign_in_token
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center
+                              %p= t 'user_mailer.sign_in_token.details'
+                          %tr
+                            %td.column-cell.text-center
+                              %p
+                                %strong= "#{t('sessions.ip')}:"
+                                = @remote_ip
+                                %br/
+                                %strong= "#{t('sessions.browser')}:"
+                                %span{ title: @user_agent }= t 'sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")
+                                %br/
+                                = l(@timestamp)
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center
+                              %p= t 'user_mailer.sign_in_token.further_actions'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  %table.column{ cellspacing: 0, cellpadding: 0 }
+                    %tbody
+                      %tr
+                        %td.column-cell.button-cell
+                          %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                            %tbody
+                              %tr
+                                %td.button-primary
+                                  = link_to edit_user_registration_url do
+                                    %span= t 'settings.account_settings'
diff --git a/app/views/user_mailer/sign_in_token.text.erb b/app/views/user_mailer/sign_in_token.text.erb
new file mode 100644
index 000000000..2539ddaf6
--- /dev/null
+++ b/app/views/user_mailer/sign_in_token.text.erb
@@ -0,0 +1,17 @@
+<%= t 'user_mailer.sign_in_token.title' %>
+
+===
+
+<%= t 'user_mailer.sign_in_token.explanation' %>
+
+=> <%= @resource.sign_in_token %>
+
+<%= t 'user_mailer.sign_in_token.details' %>
+
+<%= t('sessions.ip') %>: <%= @remote_ip %>
+<%= t('sessions.browser') %>: <%= t('sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")) %>
+<%= l(@timestamp) %>
+
+<%= t 'user_mailer.sign_in_token.further_actions' %>
+
+=> <%= edit_user_registration_url %>
diff --git a/app/workers/activitypub/distribution_worker.rb b/app/workers/activitypub/distribution_worker.rb
index 11b6a6111..e4997ba0e 100644
--- a/app/workers/activitypub/distribution_worker.rb
+++ b/app/workers/activitypub/distribution_worker.rb
@@ -43,7 +43,7 @@ class ActivityPub::DistributionWorker
   end
 
   def payload
-    @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @account))
+    @payload ||= Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @account))
   end
 
   def relay!
diff --git a/app/workers/activitypub/reply_distribution_worker.rb b/app/workers/activitypub/reply_distribution_worker.rb
index 1ff8a657e..d4d0148ac 100644
--- a/app/workers/activitypub/reply_distribution_worker.rb
+++ b/app/workers/activitypub/reply_distribution_worker.rb
@@ -29,6 +29,6 @@ class ActivityPub::ReplyDistributionWorker
   end
 
   def payload
-    @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @status.account))
+    @payload ||= Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @status.account))
   end
 end
diff --git a/app/workers/domain_block_worker.rb b/app/workers/domain_block_worker.rb
index 35518d6b5..3c601cd83 100644
--- a/app/workers/domain_block_worker.rb
+++ b/app/workers/domain_block_worker.rb
@@ -4,8 +4,9 @@ class DomainBlockWorker
   include Sidekiq::Worker
 
   def perform(domain_block_id, update = false)
-    BlockDomainService.new.call(DomainBlock.find(domain_block_id), update)
-  rescue ActiveRecord::RecordNotFound
-    true
+    domain_block = DomainBlock.find_by(id: domain_block_id)
+    return true if domain_block.nil?
+
+    BlockDomainService.new.call(domain_block, update)
   end
 end
diff --git a/app/workers/domain_clear_media_worker.rb b/app/workers/domain_clear_media_worker.rb
new file mode 100644
index 000000000..971934a08
--- /dev/null
+++ b/app/workers/domain_clear_media_worker.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class DomainClearMediaWorker
+  include Sidekiq::Worker
+
+  sidekiq_options queue: 'pull'
+
+  def perform(domain_block_id)
+    domain_block = DomainBlock.find_by(id: domain_block_id)
+    return true if domain_block.nil?
+
+    ClearDomainMediaService.new.call(domain_block)
+  end
+end
diff --git a/app/workers/import/relationship_worker.rb b/app/workers/import/relationship_worker.rb
index 616da6da9..4a455f3ae 100644
--- a/app/workers/import/relationship_worker.rb
+++ b/app/workers/import/relationship_worker.rb
@@ -7,7 +7,8 @@ class Import::RelationshipWorker
 
   def perform(account_id, target_account_uri, relationship, options = {})
     from_account   = Account.find(account_id)
-    target_account = ResolveAccountService.new.call(target_account_uri)
+    target_domain  = domain(target_account_uri)
+    target_account = stoplight_wrap_request(target_domain) { ResolveAccountService.new.call(target_account_uri, { check_delivery_availability: true }) }
     options.symbolize_keys!
 
     return if target_account.nil?
@@ -29,4 +30,22 @@ class Import::RelationshipWorker
   rescue ActiveRecord::RecordNotFound
     true
   end
+
+  def domain(uri)
+    domain = uri.is_a?(Account) ? uri.domain : uri.split('@')[1]
+    TagManager.instance.local_domain?(domain) ? nil : TagManager.instance.normalize_domain(domain)
+  end
+
+  def stoplight_wrap_request(domain, &block)
+    if domain.present?
+      Stoplight("source:#{domain}", &block)
+        .with_fallback { nil }
+        .with_threshold(1)
+        .with_cool_off_time(5.minutes.seconds)
+        .with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) }
+        .run
+    else
+      block.call
+    end
+  end
 end
diff --git a/app/workers/push_conversation_worker.rb b/app/workers/push_conversation_worker.rb
index 16f538215..aa858f715 100644
--- a/app/workers/push_conversation_worker.rb
+++ b/app/workers/push_conversation_worker.rb
@@ -2,13 +2,14 @@
 
 class PushConversationWorker
   include Sidekiq::Worker
+  include Redisable
 
   def perform(conversation_account_id)
     conversation = AccountConversation.find(conversation_account_id)
     message      = InlineRenderer.render(conversation, conversation.account, :conversation)
     timeline_id  = "timeline:direct:#{conversation.account_id}"
 
-    Redis.current.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
+    redis.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
   rescue ActiveRecord::RecordNotFound
     true
   end
diff --git a/app/workers/push_encrypted_message_worker.rb b/app/workers/push_encrypted_message_worker.rb
new file mode 100644
index 000000000..031230172
--- /dev/null
+++ b/app/workers/push_encrypted_message_worker.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class PushEncryptedMessageWorker
+  include Sidekiq::Worker
+  include Redisable
+
+  def perform(encrypted_message_id)
+    encrypted_message = EncryptedMessage.find(encrypted_message_id)
+    message           = InlineRenderer.render(encrypted_message, nil, :encrypted_message)
+    timeline_id       = "timeline:#{encrypted_message.device.account_id}:#{encrypted_message.device.device_id}"
+
+    redis.publish(timeline_id, Oj.dump(event: :encrypted_message, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
+  rescue ActiveRecord::RecordNotFound
+    true
+  end
+end
diff --git a/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb b/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
index 94788a85b..bb9dd49ca 100644
--- a/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
+++ b/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
@@ -8,5 +8,6 @@ class Scheduler::DoorkeeperCleanupScheduler
   def perform
     Doorkeeper::AccessToken.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
     Doorkeeper::AccessGrant.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
+    SystemKey.expired.delete_all
   end
 end
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 7e3828f7e..baa993c78 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -1,33 +1,13 @@
 {
   "ignored_warnings": [
     {
-      "warning_type": "Mass Assignment",
-      "warning_code": 105,
-      "fingerprint": "0117d2be5947ea4e4fbed9c15f23c6615b12c6892973411820c83d079808819d",
-      "check_name": "PermitAttributes",
-      "message": "Potentially dangerous key allowed for mass assignment",
-      "file": "app/controllers/api/v1/search_controller.rb",
-      "line": 30,
-      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
-      "code": "params.permit(:type, :offset, :min_id, :max_id, :account_id)",
-      "render_path": null,
-      "location": {
-        "type": "method",
-        "class": "Api::V1::SearchController",
-        "method": "search_params"
-      },
-      "user_input": ":account_id",
-      "confidence": "High",
-      "note": ""
-    },
-    {
       "warning_type": "SQL Injection",
       "warning_code": 0,
       "fingerprint": "04dbbc249b989db2e0119bbb0f59c9818e12889d2b97c529cdc0b1526002ba4b",
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/report.rb",
-      "line": 90,
+      "line": 112,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "Admin::ActionLog.from(\"(#{[Admin::ActionLog.where(:target_type => \"Report\", :target_id => id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Account\", :target_id => target_account_id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Status\", :target_id => status_ids, :created_at => ((created_at..updated_at))).unscope(:order)].map do\n \"(#{query.to_sql})\"\n end.join(\" UNION ALL \")}) AS admin_action_logs\")",
       "render_path": null,
@@ -47,7 +27,7 @@
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 87,
+      "line": 100,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "result.joins(\"INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")",
       "render_path": null,
@@ -61,39 +41,62 @@
       "note": ""
     },
     {
-      "warning_type": "Mass Assignment",
-      "warning_code": 105,
-      "fingerprint": "28d81cc22580ef76e912b077b245f353499aa27b3826476667224c00227af2a9",
-      "check_name": "PermitAttributes",
-      "message": "Potentially dangerous key allowed for mass assignment",
-      "file": "app/controllers/admin/reports_controller.rb",
-      "line": 56,
-      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
-      "code": "params.permit(:account_id, :resolved, :target_account_id)",
-      "render_path": null,
+      "warning_type": "Dynamic Render Path",
+      "warning_code": 15,
+      "fingerprint": "20a660939f2bbf8c665e69f2844031c0564524689a9570a0091ed94846212020",
+      "check_name": "Render",
+      "message": "Render path contains parameter value",
+      "file": "app/views/admin/action_logs/index.html.haml",
+      "line": 26,
+      "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
+      "code": "render(action => Admin::ActionLogFilter.new(filter_params).results.page(params[:page]), {})",
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::ActionLogsController",
+          "method": "index",
+          "line": 8,
+          "file": "app/controllers/admin/action_logs_controller.rb",
+          "rendered": {
+            "name": "admin/action_logs/index",
+            "file": "app/views/admin/action_logs/index.html.haml"
+          }
+        }
+      ],
       "location": {
-        "type": "method",
-        "class": "Admin::ReportsController",
-        "method": "filter_params"
+        "type": "template",
+        "template": "admin/action_logs/index"
       },
-      "user_input": ":account_id",
-      "confidence": "High",
+      "user_input": "params[:page]",
+      "confidence": "Weak",
       "note": ""
     },
     {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
-      "fingerprint": "4b6a895e2805578d03ceedbe1d469cc75a0c759eba093722523edb4b8683c873",
+      "fingerprint": "371fe16dc4c9d6ab08a20437d65be4825776107a67c38f6d4780a9c703cd44a5",
       "check_name": "Render",
       "message": "Render path contains parameter value",
-      "file": "app/views/admin/action_logs/index.html.haml",
-      "line": 4,
+      "file": "app/views/admin/email_domain_blocks/index.html.haml",
+      "line": 17,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
-      "code": "render(action => Admin::ActionLog.page(params[:page]), {})",
-      "render_path": [{"type":"controller","class":"Admin::ActionLogsController","method":"index","line":7,"file":"app/controllers/admin/action_logs_controller.rb","rendered":{"name":"admin/action_logs/index","file":"/home/eugr/Projects/mastodon/app/views/admin/action_logs/index.html.haml"}}],
+      "code": "render(action => EmailDomainBlock.where(:parent_id => nil).includes(:children).order(:id => :desc).page(params[:page]), {})",
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::EmailDomainBlocksController",
+          "method": "index",
+          "line": 10,
+          "file": "app/controllers/admin/email_domain_blocks_controller.rb",
+          "rendered": {
+            "name": "admin/email_domain_blocks/index",
+            "file": "app/views/admin/email_domain_blocks/index.html.haml"
+          }
+        }
+      ],
       "location": {
         "type": "template",
-        "template": "admin/action_logs/index"
+        "template": "admin/email_domain_blocks/index"
       },
       "user_input": "params[:page]",
       "confidence": "Weak",
@@ -106,7 +109,7 @@
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
       "file": "app/controllers/remote_interaction_controller.rb",
-      "line": 21,
+      "line": 24,
       "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
       "code": "redirect_to(RemoteFollow.new(resource_params).interact_address_for(Status.find(params[:id])))",
       "render_path": null,
@@ -120,32 +123,13 @@
       "note": ""
     },
     {
-      "warning_type": "Dynamic Render Path",
-      "warning_code": 15,
-      "fingerprint": "67afc0d5f7775fa5bd91d1912e1b5505aeedef61876347546fa20f92fd6915e6",
-      "check_name": "Render",
-      "message": "Render path contains parameter value",
-      "file": "app/views/stream_entries/embed.html.haml",
-      "line": 3,
-      "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
-      "code": "render(action => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :centered => true, :autoplay => ActiveModel::Type::Boolean.new.cast(params[:autoplay]) })",
-      "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":63,"file":"app/controllers/statuses_controller.rb","rendered":{"name":"stream_entries/embed","file":"/home/eugr/Projects/mastodon/app/views/stream_entries/embed.html.haml"}}],
-      "location": {
-        "type": "template",
-        "template": "stream_entries/embed"
-      },
-      "user_input": "params[:id]",
-      "confidence": "Weak",
-      "note": ""
-    },
-    {
       "warning_type": "SQL Injection",
       "warning_code": 0,
       "fingerprint": "6f075c1484908e3ec9bed21ab7cf3c7866be8da3881485d1c82e13093aefcbd7",
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 92,
+      "line": 105,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "result.joins(\"LEFT OUTER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")",
       "render_path": null,
@@ -159,22 +143,43 @@
       "note": ""
     },
     {
-      "warning_type": "Dynamic Render Path",
-      "warning_code": 15,
-      "fingerprint": "8d843713d99e8403f7992f3e72251b633817cf9076ffcbbad5613859d2bbc127",
-      "check_name": "Render",
-      "message": "Render path contains parameter value",
-      "file": "app/views/admin/custom_emojis/index.html.haml",
-      "line": 45,
-      "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
-      "code": "render(action => filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page]), {})",
-      "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":11,"file":"app/controllers/admin/custom_emojis_controller.rb","rendered":{"name":"admin/custom_emojis/index","file":"/home/eugr/Projects/mastodon/app/views/admin/custom_emojis/index.html.haml"}}],
+      "warning_type": "Mass Assignment",
+      "warning_code": 105,
+      "fingerprint": "7631e93d0099506e7c3e5c91ba8d88523b00a41a0834ae30031a5a4e8bb3020a",
+      "check_name": "PermitAttributes",
+      "message": "Potentially dangerous key allowed for mass assignment",
+      "file": "app/controllers/api/v2/search_controller.rb",
+      "line": 28,
+      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
+      "code": "params.permit(:type, :offset, :min_id, :max_id, :account_id)",
+      "render_path": null,
       "location": {
-        "type": "template",
-        "template": "admin/custom_emojis/index"
+        "type": "method",
+        "class": "Api::V2::SearchController",
+        "method": "search_params"
       },
-      "user_input": "params[:page]",
-      "confidence": "Weak",
+      "user_input": ":account_id",
+      "confidence": "High",
+      "note": ""
+    },
+    {
+      "warning_type": "Mass Assignment",
+      "warning_code": 105,
+      "fingerprint": "8f63dec68951d9bcf7eddb15af9392b2e1333003089c41fb76688dfd3579f394",
+      "check_name": "PermitAttributes",
+      "message": "Potentially dangerous key allowed for mass assignment",
+      "file": "app/controllers/api/v1/crypto/deliveries_controller.rb",
+      "line": 23,
+      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
+      "code": "params.require(:device).permit(:account_id, :device_id, :type, :body, :hmac)",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "Api::V1::Crypto::DeliveriesController",
+        "method": "resource_params"
+      },
+      "user_input": ":account_id",
+      "confidence": "High",
       "note": ""
     },
     {
@@ -204,10 +209,22 @@
       "check_name": "Render",
       "message": "Render path contains parameter value",
       "file": "app/views/admin/accounts/index.html.haml",
-      "line": 47,
+      "line": 54,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => filtered_accounts.page(params[:page]), {})",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"index","line":12,"file":"app/controllers/admin/accounts_controller.rb","rendered":{"name":"admin/accounts/index","file":"/home/eugr/Projects/mastodon/app/views/admin/accounts/index.html.haml"}}],
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::AccountsController",
+          "method": "index",
+          "line": 12,
+          "file": "app/controllers/admin/accounts_controller.rb",
+          "rendered": {
+            "name": "admin/accounts/index",
+            "file": "app/views/admin/accounts/index.html.haml"
+          }
+        }
+      ],
       "location": {
         "type": "template",
         "template": "admin/accounts/index"
@@ -219,40 +236,40 @@
     {
       "warning_type": "Redirect",
       "warning_code": 18,
-      "fingerprint": "ba699ddcc6552c422c4ecd50d2cd217f616a2446659e185a50b05a0f2dad8d33",
+      "fingerprint": "ba568ac09683f98740f663f3d850c31785900215992e8c090497d359a2563d50",
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
-      "file": "app/controllers/media_controller.rb",
-      "line": 14,
+      "file": "app/controllers/remote_follow_controller.rb",
+      "line": 21,
       "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
-      "code": "redirect_to(MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original))",
+      "code": "redirect_to(RemoteFollow.new(resource_params).subscribe_address_for(@account))",
       "render_path": null,
       "location": {
         "type": "method",
-        "class": "MediaController",
-        "method": "show"
+        "class": "RemoteFollowController",
+        "method": "create"
       },
-      "user_input": "MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original)",
+      "user_input": "RemoteFollow.new(resource_params).subscribe_address_for(@account)",
       "confidence": "High",
       "note": ""
     },
     {
       "warning_type": "Redirect",
       "warning_code": 18,
-      "fingerprint": "bb7e94e60af41decb811bb32171f1b27e9bf3f4d01e9e511127362e22510eb11",
+      "fingerprint": "ba699ddcc6552c422c4ecd50d2cd217f616a2446659e185a50b05a0f2dad8d33",
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
-      "file": "app/controllers/remote_follow_controller.rb",
-      "line": 19,
+      "file": "app/controllers/media_controller.rb",
+      "line": 20,
       "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
-      "code": "redirect_to(RemoteFollow.new(resource_params).subscribe_address_for(Account.find_local!(params[:account_username])))",
+      "code": "redirect_to(MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original))",
       "render_path": null,
       "location": {
         "type": "method",
-        "class": "RemoteFollowController",
-        "method": "create"
+        "class": "MediaController",
+        "method": "show"
       },
-      "user_input": "RemoteFollow.new(resource_params).subscribe_address_for(Account.find_local!(params[:account_username]))",
+      "user_input": "MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original)",
       "confidence": "High",
       "note": ""
     },
@@ -275,27 +292,8 @@
       "user_input": ":account_id",
       "confidence": "High",
       "note": ""
-    },
-    {
-      "warning_type": "Dynamic Render Path",
-      "warning_code": 15,
-      "fingerprint": "fbd0fc59adb5c6d44b60e02debb31d3af11719f534c9881e21435bbff87404d6",
-      "check_name": "Render",
-      "message": "Render path contains parameter value",
-      "file": "app/views/stream_entries/show.html.haml",
-      "line": 23,
-      "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
-      "code": "render(partial => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { :locals => ({ Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :include_threads => true }) })",
-      "render_path": [{"type":"controller","class":"StatusesController","method":"show","line":34,"file":"app/controllers/statuses_controller.rb","rendered":{"name":"stream_entries/show","file":"/home/eugr/Projects/mastodon/app/views/stream_entries/show.html.haml"}}],
-      "location": {
-        "type": "template",
-        "template": "stream_entries/show"
-      },
-      "user_input": "params[:id]",
-      "confidence": "Weak",
-      "note": ""
     }
   ],
-  "updated": "2019-02-21 02:30:29 +0100",
-  "brakeman_version": "4.4.0"
+  "updated": "2020-06-01 18:18:02 +0200",
+  "brakeman_version": "4.8.0"
 }
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index e03380cec..63cff7c59 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -95,7 +95,8 @@ Doorkeeper.configure do
                   :'admin:read:reports',
                   :'admin:write',
                   :'admin:write:accounts',
-                  :'admin:write:reports'
+                  :'admin:write:reports',
+                  :crypto
 
   # Change the way client credentials are retrieved from the request object.
   # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index 0667a542c..ebb7541eb 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -19,6 +19,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
   inflect.acronym 'ActivityStreams'
   inflect.acronym 'JsonLd'
   inflect.acronym 'NodeInfo'
+  inflect.acronym 'Ed25519'
 
   inflect.singular 'data', 'data'
 end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 116db4498..aed96e3e1 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -35,13 +35,16 @@ en:
     status_count_before: Who authored
     tagline: Follow friends and discover new ones
     terms: Terms of service
-    unavailable_content: Unavailable content
+    unavailable_content: Moderated servers
     unavailable_content_description:
       domain: Server
       reason: Reason
       rejecting_media: 'Media files from these servers will not be processed or stored, and no thumbnails will be displayed, requiring manual click-through to the original file:'
-      silenced: 'Posts from these servers will be hidden in public timelines and conversations, and no notifications will be generated from their users'' interactions, unless you are following them:'
+      rejecting_media_title: Filtered media
+      silenced: 'Posts from these servers will be hidden in public timelines and conversations, and no notifications will be generated from their users interactions, unless you are following them:'
+      silenced_title: Silenced servers
       suspended: 'No data from these servers will be processed, stored or exchanged, making any interaction or communication with users from these servers impossible:'
+      suspended_title: Suspended servers
     unavailable_content_html: Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.
     user_count_after:
       one: user
@@ -309,6 +312,7 @@ en:
       listed: Listed
       new:
         title: Add new custom emoji
+      not_permitted: You are not permitted to perform this action
       overwrite: Overwrite
       shortcode: Shortcode
       shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
@@ -721,6 +725,10 @@ en:
     hint_html: "<strong>Tip:</strong> We won't ask you for your password again for the next hour."
     invalid_password: Invalid password
     prompt: Confirm password to continue
+  crypto:
+    errors:
+      invalid_key: is not a valid Ed25519 or Curve25519 key
+      invalid_signature: is not a valid Ed25519 signature
   date:
     formats:
       default: "%b %d, %Y"
@@ -918,6 +926,7 @@ en:
     on_cooldown: You have recently migrated your account. This function will become available again in %{count} days.
     past_migrations: Past migrations
     proceed_with_move: Move followers
+    redirected_msg: Your account is now redirecting to %{acct}.
     redirecting_to: Your account is redirecting to %{acct}.
     set_redirect: Set redirect
     warning:
@@ -1267,6 +1276,12 @@ en:
       explanation: You requested a full backup of your Mastodon account. It's now ready for download!
       subject: Your archive is ready for download
       title: Archive takeout
+    sign_in_token:
+      details: 'Here are details of the attempt:'
+      explanation: 'We detected an attempt to sign in to your account from an unrecognized IP address. If this is you, please enter the security code below on the sign in challenge page:'
+      further_actions: 'If this wasn''t you, please change your password and enable two-factor authentication on your account. You can do so here:'
+      subject: Please confirm attempted sign in
+      title: Sign in attempt
     warning:
       explanation:
         disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked.
@@ -1304,11 +1319,14 @@ en:
       title: Welcome aboard, %{name}!
   users:
     follow_limit_reached: You cannot follow more than %{limit} people
+    generic_access_help_html: Trouble accessing your account? You may get in touch with %{email} for assistance
     invalid_email: The e-mail address is invalid
     invalid_otp_token: Invalid two-factor code
+    invalid_sign_in_token: Invalid security code
     otp_lost_help_html: If you lost access to both, you may get in touch with %{email}
     seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available.
     signed_in_as: 'Signed in as:'
+    suspicious_sign_in_confirmation: You appear to not have logged in from this device before, and you haven't logged in for a while, so we're sending a security code to your e-mail address to confirm that it's you.
   verification:
     explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
     verification: Verification
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index fd56a35bf..f84b6c884 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -151,6 +151,7 @@ en:
         setting_use_blurhash: Show colorful gradients for hidden media
         setting_use_pending_items: Slow mode
         severity: Severity
+        sign_in_token_attempt: Security code
         type: Import type
         username: Username
         username_or_email: Username or Email
diff --git a/config/routes.rb b/config/routes.rb
index 42f2f0f7f..93e995df2 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -79,6 +79,7 @@ Rails.application.routes.draw do
 
     resource :outbox, only: [:show], module: :activitypub
     resource :inbox, only: [:create], module: :activitypub
+    resource :claim, only: [:create], module: :activitypub
     resources :collections, only: [:show], module: :activitypub
   end
 
@@ -342,6 +343,23 @@ Rails.application.routes.draw do
         end
       end
 
+      namespace :crypto do
+        resources :deliveries, only: :create
+
+        namespace :keys do
+          resource :upload, only: [:create]
+          resource :query,  only: [:create]
+          resource :claim,  only: [:create]
+          resource :count,  only: [:show]
+        end
+
+        resources :encrypted_messages, only: [:index] do
+          collection do
+            post :clear
+          end
+        end
+      end
+
       resources :conversations, only: [:index, :destroy] do
         member do
           post :read
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 08526957b..36b5a459e 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -110,10 +110,12 @@ module.exports = {
       writeToDisk: true,
       publicPath: true,
     }),
-    new CopyPlugin([
-      { from: 'node_modules/tesseract.js/dist/worker.min.js', to: 'ocr' },
-      { from: 'node_modules/tesseract.js-core/tesseract-core.wasm.js', to: 'ocr' },
-    ]),
+    new CopyPlugin({
+      patterns: [
+        { from: 'node_modules/tesseract.js/dist/worker.min.js', to: 'ocr' },
+        { from: 'node_modules/tesseract.js-core/tesseract-core.wasm.js', to: 'ocr' },
+      ],
+    }),
   ],
 
   resolve: {
diff --git a/db/migrate/20170129000348_create_devices.rb b/db/migrate/20170129000348_create_devices.rb
deleted file mode 100644
index bf8f5fc6e..000000000
--- a/db/migrate/20170129000348_create_devices.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class CreateDevices < ActiveRecord::Migration[5.0]
-  def change
-    create_table :devices do |t|
-      t.integer :account_id, null: false
-      t.string :registration_id, null: false, default: ''
-
-      t.timestamps
-    end
-
-    add_index :devices, :registration_id
-    add_index :devices, :account_id
-  end
-end
diff --git a/db/migrate/20170205175257_remove_devices.rb b/db/migrate/20170205175257_remove_devices.rb
index e96ffed4d..9ef5c440e 100644
--- a/db/migrate/20170205175257_remove_devices.rb
+++ b/db/migrate/20170205175257_remove_devices.rb
@@ -1,5 +1,5 @@
 class RemoveDevices < ActiveRecord::Migration[5.0]
   def change
-    drop_table :devices
+    drop_table :devices if table_exists?(:devices)
   end
 end
diff --git a/db/migrate/20200516180352_create_devices.rb b/db/migrate/20200516180352_create_devices.rb
new file mode 100644
index 000000000..04a628a89
--- /dev/null
+++ b/db/migrate/20200516180352_create_devices.rb
@@ -0,0 +1,14 @@
+class CreateDevices < ActiveRecord::Migration[5.2]
+  def change
+    create_table :devices do |t|
+      t.references :access_token, foreign_key: { to_table: :oauth_access_tokens, on_delete: :cascade, index: :unique }
+      t.references :account, foreign_key: { on_delete: :cascade }
+      t.string :device_id, default: '', null: false
+      t.string :name, default: '', null: false
+      t.text :fingerprint_key, default: '', null: false
+      t.text :identity_key, default: '', null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200516183822_create_one_time_keys.rb b/db/migrate/20200516183822_create_one_time_keys.rb
new file mode 100644
index 000000000..642b9e632
--- /dev/null
+++ b/db/migrate/20200516183822_create_one_time_keys.rb
@@ -0,0 +1,12 @@
+class CreateOneTimeKeys < ActiveRecord::Migration[5.2]
+  def change
+    create_table :one_time_keys do |t|
+      t.references :device, foreign_key: { on_delete: :cascade }
+      t.string :key_id, default: '', null: false, index: :unique
+      t.text :key, default: '', null: false
+      t.text :signature, default: '', null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200518083523_create_encrypted_messages.rb b/db/migrate/20200518083523_create_encrypted_messages.rb
new file mode 100644
index 000000000..486726303
--- /dev/null
+++ b/db/migrate/20200518083523_create_encrypted_messages.rb
@@ -0,0 +1,15 @@
+class CreateEncryptedMessages < ActiveRecord::Migration[5.2]
+  def change
+    create_table :encrypted_messages do |t|
+      t.references :device, foreign_key: { on_delete: :cascade }
+      t.references :from_account, foreign_key: { to_table: :accounts, on_delete: :cascade }
+      t.string :from_device_id, default: '', null: false
+      t.integer :type, default: 0, null: false
+      t.text :body, default: '', null: false
+      t.text :digest, default: '', null: false
+      t.text :message_franking, default: '', null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb b/db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb
new file mode 100644
index 000000000..24d43a0bf
--- /dev/null
+++ b/db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb
@@ -0,0 +1,13 @@
+class EncryptedMessageIdsToTimestampIds < ActiveRecord::Migration[5.2]
+  def up
+    safety_assured do
+      execute("ALTER TABLE encrypted_messages ALTER COLUMN id SET DEFAULT timestamp_id('encrypted_messages')")
+    end
+  end
+
+  def down
+    execute("LOCK encrypted_messages")
+    execute("SELECT setval('encrypted_messages_id_seq', (SELECT MAX(id) FROM encrypted_messages))")
+    execute("ALTER TABLE encrypted_messages ALTER COLUMN id SET DEFAULT nextval('encrypted_messages_id_seq')")
+  end
+end
diff --git a/db/migrate/20200529214050_add_devices_url_to_accounts.rb b/db/migrate/20200529214050_add_devices_url_to_accounts.rb
new file mode 100644
index 000000000..564877e5d
--- /dev/null
+++ b/db/migrate/20200529214050_add_devices_url_to_accounts.rb
@@ -0,0 +1,5 @@
+class AddDevicesUrlToAccounts < ActiveRecord::Migration[5.2]
+  def change
+    add_column :accounts, :devices_url, :string
+  end
+end
diff --git a/db/migrate/20200601222558_create_system_keys.rb b/db/migrate/20200601222558_create_system_keys.rb
new file mode 100644
index 000000000..fd9d221aa
--- /dev/null
+++ b/db/migrate/20200601222558_create_system_keys.rb
@@ -0,0 +1,9 @@
+class CreateSystemKeys < ActiveRecord::Migration[5.2]
+  def change
+    create_table :system_keys do |t|
+      t.binary :key
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200605155027_add_blurhash_to_preview_cards.rb b/db/migrate/20200605155027_add_blurhash_to_preview_cards.rb
new file mode 100644
index 000000000..dc4b7a984
--- /dev/null
+++ b/db/migrate/20200605155027_add_blurhash_to_preview_cards.rb
@@ -0,0 +1,5 @@
+class AddBlurhashToPreviewCards < ActiveRecord::Migration[5.2]
+  def change
+    add_column :preview_cards, :blurhash, :string
+  end
+end
diff --git a/db/migrate/20200608113046_add_sign_in_token_to_users.rb b/db/migrate/20200608113046_add_sign_in_token_to_users.rb
new file mode 100644
index 000000000..baa63c10f
--- /dev/null
+++ b/db/migrate/20200608113046_add_sign_in_token_to_users.rb
@@ -0,0 +1,6 @@
+class AddSignInTokenToUsers < ActiveRecord::Migration[5.2]
+  def change
+    add_column :users, :sign_in_token, :string
+    add_column :users, :sign_in_token_sent_at, :datetime
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index e52fefa91..c1b6ffa81 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2020_05_10_110808) do
+ActiveRecord::Schema.define(version: 2020_06_08_113046) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -174,6 +174,7 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.boolean "hide_collections"
     t.integer "avatar_storage_schema_version"
     t.integer "header_storage_schema_version"
+    t.string "devices_url"
     t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
     t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
     t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
@@ -317,6 +318,19 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["account_id"], name: "index_custom_filters_on_account_id"
   end
 
+  create_table "devices", force: :cascade do |t|
+    t.bigint "access_token_id"
+    t.bigint "account_id"
+    t.string "device_id", default: "", null: false
+    t.string "name", default: "", null: false
+    t.text "fingerprint_key", default: "", null: false
+    t.text "identity_key", default: "", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["access_token_id"], name: "index_devices_on_access_token_id"
+    t.index ["account_id"], name: "index_devices_on_account_id"
+  end
+
   create_table "domain_allows", force: :cascade do |t|
     t.string "domain", default: "", null: false
     t.datetime "created_at", null: false
@@ -344,6 +358,20 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true
   end
 
+  create_table "encrypted_messages", id: :bigint, default: -> { "timestamp_id('encrypted_messages'::text)" }, force: :cascade do |t|
+    t.bigint "device_id"
+    t.bigint "from_account_id"
+    t.string "from_device_id", default: "", null: false
+    t.integer "type", default: 0, null: false
+    t.text "body", default: "", null: false
+    t.text "digest", default: "", null: false
+    t.text "message_franking", default: "", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["device_id"], name: "index_encrypted_messages_on_device_id"
+    t.index ["from_account_id"], name: "index_encrypted_messages_on_from_account_id"
+  end
+
   create_table "favourites", force: :cascade do |t|
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
@@ -552,6 +580,17 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true
   end
 
+  create_table "one_time_keys", force: :cascade do |t|
+    t.bigint "device_id"
+    t.string "key_id", default: "", null: false
+    t.text "key", default: "", null: false
+    t.text "signature", default: "", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["device_id"], name: "index_one_time_keys_on_device_id"
+    t.index ["key_id"], name: "index_one_time_keys_on_key_id"
+  end
+
   create_table "pghero_space_stats", force: :cascade do |t|
     t.text "database"
     t.text "schema"
@@ -610,6 +649,7 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.datetime "updated_at", null: false
     t.string "embed_url", default: "", null: false
     t.integer "image_storage_schema_version"
+    t.string "blurhash"
     t.index ["url"], name: "index_preview_cards_on_url", unique: true
   end
 
@@ -752,6 +792,12 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["tag_id", "status_id"], name: "index_statuses_tags_on_tag_id_and_status_id", unique: true
   end
 
+  create_table "system_keys", force: :cascade do |t|
+    t.binary "key"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+  end
+
   create_table "tags", force: :cascade do |t|
     t.string "name", default: "", null: false
     t.datetime "created_at", null: false
@@ -827,6 +873,8 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.string "chosen_languages", array: true
     t.bigint "created_by_application_id"
     t.boolean "approved", default: true, null: false
+    t.string "sign_in_token"
+    t.datetime "sign_in_token_sent_at"
     t.index ["account_id"], name: "index_users_on_account_id"
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
     t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id"
@@ -886,7 +934,11 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
   add_foreign_key "conversation_mutes", "accounts", name: "fk_225b4212bb", on_delete: :cascade
   add_foreign_key "conversation_mutes", "conversations", on_delete: :cascade
   add_foreign_key "custom_filters", "accounts", on_delete: :cascade
+  add_foreign_key "devices", "accounts", on_delete: :cascade
+  add_foreign_key "devices", "oauth_access_tokens", column: "access_token_id", on_delete: :cascade
   add_foreign_key "email_domain_blocks", "email_domain_blocks", column: "parent_id", on_delete: :cascade
+  add_foreign_key "encrypted_messages", "accounts", column: "from_account_id", on_delete: :cascade
+  add_foreign_key "encrypted_messages", "devices", on_delete: :cascade
   add_foreign_key "favourites", "accounts", name: "fk_5eb6c2b873", on_delete: :cascade
   add_foreign_key "favourites", "statuses", name: "fk_b0e856845e", on_delete: :cascade
   add_foreign_key "featured_tags", "accounts", on_delete: :cascade
@@ -917,6 +969,7 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
   add_foreign_key "oauth_access_tokens", "oauth_applications", column: "application_id", name: "fk_f5fc4c1ee3", on_delete: :cascade
   add_foreign_key "oauth_access_tokens", "users", column: "resource_owner_id", name: "fk_e84df68546", on_delete: :cascade
   add_foreign_key "oauth_applications", "users", column: "owner_id", name: "fk_b0988c7c0a", on_delete: :cascade
+  add_foreign_key "one_time_keys", "devices", on_delete: :cascade
   add_foreign_key "poll_votes", "accounts", on_delete: :cascade
   add_foreign_key "poll_votes", "polls", on_delete: :cascade
   add_foreign_key "polls", "accounts", on_delete: :cascade
diff --git a/lib/paperclip/blurhash_transcoder.rb b/lib/paperclip/blurhash_transcoder.rb
index 5c33c98b0..1c3a6df02 100644
--- a/lib/paperclip/blurhash_transcoder.rb
+++ b/lib/paperclip/blurhash_transcoder.rb
@@ -3,7 +3,7 @@
 module Paperclip
   class BlurhashTranscoder < Paperclip::Processor
     def make
-      return @file unless options[:style] == :small
+      return @file unless options[:style] == :small || options[:blurhash]
 
       pixels   = convert(':source RGB:-', source: File.expand_path(@file.path)).unpack('C*')
       geometry = options.fetch(:file_geometry_parser).from_file(@file)
diff --git a/lib/tasks/emojis.rake b/lib/tasks/emojis.rake
index 70919fbdb..0e7921ffc 100644
--- a/lib/tasks/emojis.rake
+++ b/lib/tasks/emojis.rake
@@ -1,5 +1,35 @@
 # frozen_string_literal: true
 
+def gen_border(codepoint)
+  input = Rails.root.join('public', 'emoji', "#{codepoint}.svg")
+  dest = Rails.root.join('public', 'emoji', "#{codepoint}_border.svg")
+  doc = File.open(input) { |f| Nokogiri::XML(f) }
+  svg = doc.at_css('svg')
+  if svg.key?('viewBox')
+    view_box = svg['viewBox'].split(' ').map(&:to_i)
+    view_box[0] -= 2
+    view_box[1] -= 2
+    view_box[2] += 4
+    view_box[3] += 4
+    svg['viewBox'] = view_box.join(' ')
+  end
+  g = Nokogiri::XML::Node.new 'g', doc
+  doc.css('svg > *').each do |elem|
+    border_elem = elem.dup
+
+    border_elem.delete('fill')
+
+    border_elem['stroke'] = 'white'
+    border_elem['stroke-linejoin'] = 'round'
+    border_elem['stroke-width'] = '4px'
+
+    g.add_child(border_elem)
+  end
+  svg.prepend_child(g)
+  File.write(dest, doc.to_xml)
+  puts "Wrote bordered #{codepoint}.svg to #{dest}!"
+end
+
 def codepoints_to_filename(codepoints)
   codepoints.downcase.gsub(/\A[0]+/, '').tr(' ', '-')
 end
@@ -23,8 +53,10 @@ namespace :emojis do
 
     HTTP.get(source).to_s.split("\n").each do |line|
       next if line.start_with? '#'
+
       parts = line.split(';').map(&:strip)
       next if parts.size < 2
+
       codes << [parts[0], parts[1].start_with?('fully-qualified')]
     end
 
@@ -55,4 +87,16 @@ namespace :emojis do
     File.write(dest, Oj.dump(map))
     puts "Wrote emojo to destination! (#{dest})"
   end
+
+  desc 'Generate emoji variants with white borders'
+  task :generate_borders do
+    src = Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json')
+    emojis = '🎱🐜⚫🖤⬛◼️◾◼️✒️▪️💣🎳📷📸♣️🕶️✴️🔌💂‍♀️📽️🍳🦍💂🔪🕳️🕹️🕋🖊️🖋️💂‍♂️🎤🎓🎥🎼♠️🎩🦃📼📹🎮🐃🏴👽⚾🐔☁️💨🕊️👀🍥👻🐐❕❔⛸️🌩️🔊🔇📃🌧️🐏🍚🍙🐓🐑💀☠️🌨️🔉🔈💬💭🏐🏳️⚪⬜◽◻️▫️'
+
+    map = Oj.load(File.read(src))
+
+    emojis.each_grapheme_cluster do |emoji|
+      gen_border map[emoji]
+    end
+  end
 end
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index a873335d4..9e80989ef 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -1,6 +1,5 @@
 # frozen_string_literal: true
 
-require 'tty-command'
 require 'tty-prompt'
 
 namespace :mastodon do
@@ -334,8 +333,6 @@ namespace :mastodon do
       prompt.say 'This configuration will be written to .env.production'
 
       if prompt.yes?('Save configuration?')
-        cmd = TTY::Command.new(printer: :quiet)
-
         env_contents = env.each_pair.map do |key, value|
           if value.is_a?(String) && value =~ /[\s\#\\"]/
             if value =~ /[']/
@@ -367,7 +364,7 @@ namespace :mastodon do
           prompt.say 'Running `RAILS_ENV=production rails db:setup` ...'
           prompt.say "\n\n"
 
-          if cmd.run!({ RAILS_ENV: 'production', SAFETY_ASSURED: 1 }, :rails, 'db:setup').failure?
+          if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production', 'SAFETY_ASSURED' => '1' }), 'rails db:setup')
             prompt.error 'That failed! Perhaps your configuration is not right'
           else
             prompt.ok 'Done!'
@@ -382,7 +379,7 @@ namespace :mastodon do
           prompt.say 'Running `RAILS_ENV=production rails assets:precompile` ...'
           prompt.say "\n\n"
 
-          if cmd.run!({ RAILS_ENV: 'production' }, :rails, 'assets:precompile').failure?
+          if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production' }), 'rails assets:precompile')
             prompt.error 'That failed! Maybe you need swap space?'
           else
             prompt.say 'Done!'
diff --git a/package.json b/package.json
index 53937fab4..afb16618f 100644
--- a/package.json
+++ b/package.json
@@ -60,13 +60,13 @@
   },
   "private": true,
   "dependencies": {
-    "@babel/core": "^7.9.6",
+    "@babel/core": "^7.10.2",
     "@babel/plugin-proposal-class-properties": "^7.8.3",
     "@babel/plugin-proposal-decorators": "^7.8.3",
     "@babel/plugin-transform-react-inline-elements": "^7.9.0",
-    "@babel/plugin-transform-runtime": "^7.9.0",
-    "@babel/preset-env": "^7.9.6",
-    "@babel/preset-react": "^7.9.4",
+    "@babel/plugin-transform-runtime": "^7.10.1",
+    "@babel/preset-env": "^7.10.2",
+    "@babel/preset-react": "^7.10.1",
     "@babel/runtime": "^7.8.4",
     "@clusterws/cws": "^2.0.0",
     "@gamestdio/websocket": "^0.3.2",
@@ -74,7 +74,7 @@
     "array-includes": "^3.1.1",
     "arrow-key-navigation": "^1.1.0",
     "atrament": "0.2.4",
-    "autoprefixer": "^9.7.6",
+    "autoprefixer": "^9.8.0",
     "axios": "^0.19.2",
     "babel-loader": "^8.1.0",
     "babel-plugin-lodash": "^3.3.4",
@@ -85,7 +85,7 @@
     "blurhash": "^1.1.3",
     "classnames": "^2.2.5",
     "compression-webpack-plugin": "^4.0.0",
-    "copy-webpack-plugin": "^5.1.1",
+    "copy-webpack-plugin": "^6.0.2",
     "cross-env": "^7.0.2",
     "css-loader": "^3.5.3",
     "cssnano": "^4.1.10",
@@ -97,7 +97,7 @@
     "exif-js": "^2.3.0",
     "express": "^4.17.1",
     "favico.js": "^0.3.10",
-    "file-loader": "^5.1.0",
+    "file-loader": "^6.0.0",
     "font-awesome": "^4.7.0",
     "glob": "^7.1.6",
     "history": "^4.10.1",
@@ -131,7 +131,7 @@
     "react-dom": "^16.13.1",
     "react-hotkeys": "^1.1.4",
     "react-immutable-proptypes": "^2.2.0",
-    "react-immutable-pure-component": "^1.1.1",
+    "react-immutable-pure-component": "^2.2.2",
     "react-intl": "^2.9.0",
     "react-masonry-infinite": "^1.2.2",
     "react-motion": "^0.5.2",
@@ -144,7 +144,7 @@
     "react-select": "^3.1.0",
     "react-sparklines": "^1.7.0",
     "react-swipeable-views": "^0.13.9",
-    "react-textarea-autosize": "^7.1.2",
+    "react-textarea-autosize": "^8.0.1",
     "react-toggle": "^4.1.1",
     "redis": "^3.0.2",
     "redux": "^4.0.5",
@@ -159,7 +159,7 @@
     "stacktrace-js": "^2.0.2",
     "stringz": "^2.1.0",
     "substring-trie": "^1.0.2",
-    "terser-webpack-plugin": "^3.0.1",
+    "terser-webpack-plugin": "^3.0.3",
     "tesseract.js": "^2.1.1",
     "throng": "^4.0.0",
     "tiny-queue": "^0.2.1",
@@ -167,13 +167,13 @@
     "wavesurfer.js": "^3.3.3",
     "webpack": "^4.43.0",
     "webpack-assets-manifest": "^3.1.1",
-    "webpack-bundle-analyzer": "^3.7.0",
+    "webpack-bundle-analyzer": "^3.8.0",
     "webpack-cli": "^3.3.11",
     "webpack-merge": "^4.2.1",
     "wicg-inert": "^3.0.3"
   },
   "devDependencies": {
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.1.0",
     "babel-jest": "^25.2.4",
     "enzyme": "^3.11.0",
     "enzyme-adapter-react-16": "^1.15.2",
@@ -181,7 +181,7 @@
     "eslint-plugin-import": "~2.20.2",
     "eslint-plugin-jsx-a11y": "~6.2.3",
     "eslint-plugin-promise": "~4.2.1",
-    "eslint-plugin-react": "~7.19.0",
+    "eslint-plugin-react": "~7.20.0",
     "jest": "^25.4.0",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
diff --git a/public/emoji/1f327_border.svg b/public/emoji/1f327_border.svg
new file mode 100644
index 000000000..3298c8f87
--- /dev/null
+++ b/public/emoji/1f327_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.999 24.961l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.98-.937 1.943-2.039zm-1.979 7.46L9.907 29l-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm-5-4.46l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.102.966 1.975 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm18-3l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm-6.021 4l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm5.021 4.46L21.906 30l-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm6.979-5.46l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z"/>
+  <path fill="#5DADEC" d="M11.999 24.961l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.98-.937 1.943-2.039zm-1.979 7.46L9.907 29l-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm-5-4.46l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.102.966 1.975 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm18-3l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm-6.021 4l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm5.021 4.46L21.906 30l-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm6.979-5.46l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039z"/>
+</svg>
diff --git a/public/emoji/1f328_border.svg b/public/emoji/1f328_border.svg
new file mode 100644
index 000000000..254dc90de
--- /dev/null
+++ b/public/emoji/1f328_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.53 26.75c-.138-.239-.443-.32-.683-.183L4 27.634V25.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684L2.499 28.5.651 29.567c-.239.138-.32.443-.183.683.138.24.443.321.683.184L3 29.366V31.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L4.5 28.5l1.848-1.067c.239-.138.321-.443.182-.683zm10 4c-.138-.239-.443-.32-.683-.183L14 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L13 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L14.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683zM11 27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L12.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L12 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L11 25.366V27.5zm12.848-.066c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L22.5 25.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L22 24.634V22.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L21 26.366V28.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067zm10.5-1.867L32.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L32 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L31 25.366V27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.137-.239.056-.545-.183-.683zM29.53 30.75c-.138-.239-.443-.32-.683-.183L27 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L26 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L27.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z"/>
+  <path d="M6.53 26.75c-.138-.239-.443-.32-.683-.183L4 27.634V25.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684L2.499 28.5.651 29.567c-.239.138-.32.443-.183.683.138.24.443.321.683.184L3 29.366V31.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L4.5 28.5l1.848-1.067c.239-.138.321-.443.182-.683zm10 4c-.138-.239-.443-.32-.683-.183L14 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L13 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L14.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683zM11 27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L12.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L12 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L11 25.366V27.5zm12.848-.066c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L22.5 25.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L22 24.634V22.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L21 26.366V28.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067zm10.5-1.867L32.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L32 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L31 25.366V27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.137-.239.056-.545-.183-.683zM29.53 30.75c-.138-.239-.443-.32-.683-.183L27 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L26 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L27.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683z" fill="#5DADEC"/>
+</svg>
diff --git a/public/emoji/1f329_border.svg b/public/emoji/1f329_border.svg
new file mode 100644
index 000000000..05c662ac4
--- /dev/null
+++ b/public/emoji/1f329_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M13.917 36c-.091 0-.182-.029-.258-.089-.157-.124-.204-.341-.113-.518L17 29h-5.078c-.174 0-.438-.031-.562-.297-.114-.243-.057-.474.047-.703L15 19c.078-.067 6.902.393 7 .393.09 0 .182.029.257.089.157.124.204.341.112.519l-3.817 6h5.032c.174 0 .329.108.391.271.06.163.013.347-.119.461l-9.666 9.166c-.079.067-.176.101-.273.101z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#F4900C" d="M13.917 36c-.091 0-.182-.029-.258-.089-.157-.124-.204-.341-.113-.518L17 29h-5.078c-.174 0-.438-.031-.562-.297-.114-.243-.057-.474.047-.703L15 19c.078-.067 6.902.393 7 .393.09 0 .182.029.257.089.157.124.204.341.112.519l-3.817 6h5.032c.174 0 .329.108.391.271.06.163.013.347-.119.461l-9.666 9.166c-.079.067-.176.101-.273.101z"/>
+  <path fill="#E1E8ED" d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z"/>
+</svg>
diff --git a/public/emoji/1f359_border.svg b/public/emoji/1f359_border.svg
new file mode 100644
index 000000000..6541681d8
--- /dev/null
+++ b/public/emoji/1f359_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35 26c0 9.389-7.609 9-17 9s-17 .389-17-9C1 18 9 7 14 3c2.75-2 5.129-2.051 8 0 7 5 13 18 13 23z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.258 29.642c-.461.316-1.091.199-1.406-.263-.316-.46-.198-1.091.262-1.406l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.405l-1.668 1.145zm2.438-7.095c-.512-.207-.758-.792-.549-1.303.209-.512.793-.758 1.304-.549l1.852.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.852-.755zm-4.494-5.256c-.519-.21-.767-.801-.555-1.318.209-.517.801-.766 1.316-.556l1.875.764c.516.211.765.801.554 1.318-.211.517-.8.766-1.318.555l-1.872-.763zm-21.001 7c-.517-.21-.766-.801-.554-1.318.21-.517.801-.766 1.317-.556l1.873.764c.518.211.766.801.556 1.318-.211.518-.802.767-1.318.556l-1.874-.764zm3.557-6.149c-.461.316-1.091.199-1.406-.264-.315-.46-.198-1.09.262-1.405l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.406l-1.668 1.144zm9.028 3.739c-.767-.312-1.137-1.188-.824-1.956.314-.766 1.189-1.135 1.956-.823l2.778 1.134c.767.312 1.136 1.186.824 1.953-.312.768-1.188 1.137-1.956.824l-2.778-1.132zm-6.184 6.052c.522-.199 1.106.062 1.306.586.197.519-.066 1.105-.588 1.303l-1.892.721c-.519.199-1.104-.063-1.302-.586-.2-.524.062-1.107.585-1.307l1.891-.717z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24 21H12c-1.104 0-2 .896-2 2v11.812c2.384.224 5.107.188 8 .188s5.616.036 8-.188V23c0-1.104-.896-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#EEE" d="M35 26c0 9.389-7.609 9-17 9s-17 .389-17-9C1 18 9 7 14 3c2.75-2 5.129-2.051 8 0 7 5 13 18 13 23z"/>
+  <path fill="#CCD6DD" d="M27.258 29.642c-.461.316-1.091.199-1.406-.263-.316-.46-.198-1.091.262-1.406l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.405l-1.668 1.145zm2.438-7.095c-.512-.207-.758-.792-.549-1.303.209-.512.793-.758 1.304-.549l1.852.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.852-.755zm-4.494-5.256c-.519-.21-.767-.801-.555-1.318.209-.517.801-.766 1.316-.556l1.875.764c.516.211.765.801.554 1.318-.211.517-.8.766-1.318.555l-1.872-.763zm-21.001 7c-.517-.21-.766-.801-.554-1.318.21-.517.801-.766 1.317-.556l1.873.764c.518.211.766.801.556 1.318-.211.518-.802.767-1.318.556l-1.874-.764zm3.557-6.149c-.461.316-1.091.199-1.406-.264-.315-.46-.198-1.09.262-1.405l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.406l-1.668 1.144zm9.028 3.739c-.767-.312-1.137-1.188-.824-1.956.314-.766 1.189-1.135 1.956-.823l2.778 1.134c.767.312 1.136 1.186.824 1.953-.312.768-1.188 1.137-1.956.824l-2.778-1.132zm-6.184 6.052c.522-.199 1.106.062 1.306.586.197.519-.066 1.105-.588 1.303l-1.892.721c-.519.199-1.104-.063-1.302-.586-.2-.524.062-1.107.585-1.307l1.891-.717z"/>
+  <path fill="#292F33" d="M24 21H12c-1.104 0-2 .896-2 2v11.812c2.384.224 5.107.188 8 .188s5.616.036 8-.188V23c0-1.104-.896-2-2-2z"/>
+</svg>
diff --git a/public/emoji/1f35a_border.svg b/public/emoji/1f35a_border.svg
new file mode 100644
index 000000000..d6621c590
--- /dev/null
+++ b/public/emoji/1f35a_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 36C3.042 36 1 21 1 17h34c0 2-1.958 19-17 19z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="17.056" rx="17" ry="9.444" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 25c-6 0-16-3-16-8C2 11 8.125 4 18 4s16 8 16 13-9 8-16 8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.41 19.892c.419.359.468.991.108 1.41-.359.419-.991.468-1.41.108l-1.519-1.302c-.419-.359-.468-.991-.108-1.41.359-.419.991-.468 1.41-.108l1.519 1.302zm-8.127-1.507c-.304.46-.925.587-1.386.283-.46-.305-.587-.925-.283-1.386l1.103-1.669c.305-.461.925-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm23 0c-.305.46-.926.587-1.387.283-.46-.305-.587-.925-.282-1.386l1.103-1.669c.305-.461.926-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm-6.103-3.606c.11.541-.239 1.069-.78 1.18-.541.11-1.069-.239-1.18-.78l-.399-1.96c-.11-.541.238-1.069.78-1.179.541-.111 1.069.239 1.179.78l.4 1.959zm-7.54-3.958c-.345-.14-.511-.534-.37-.879.14-.344.534-.51.878-.37l1.249.509c.345.14.51.533.37.878-.141.345-.534.511-.879.37l-1.248-.508zm-9.296 1.567c-.307.211-.727.133-.938-.175-.21-.307-.132-.727.175-.937l1.113-.762c.307-.21.726-.132.937.175.21.307.132.727-.175.938l-1.112.761zm13.593 8.545c-.551-.036-.969-.513-.933-1.064.037-.55.513-.968 1.062-.933l1.997.131c.55.035.969.512.933 1.062-.035.551-.511.97-1.062.933l-1.997-.129zm-9.241-6.386c-.512-.208-.758-.793-.549-1.304.209-.511.793-.757 1.304-.549l1.853.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.853-.754zm15.945-2.726c-.346-.14-.512-.534-.37-.879.14-.344.534-.51.878-.37l1.25.509c.344.14.51.533.369.878-.141.345-.533.511-.879.37l-1.248-.508z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M18 36C3.042 36 1 21 1 17h34c0 2-1.958 19-17 19z"/>
+  <ellipse fill="#A0041E" cx="18" cy="17.056" rx="17" ry="9.444"/>
+  <path fill="#E6E9EA" d="M18 25c-6 0-16-3-16-8C2 11 8.125 4 18 4s16 8 16 13-9 8-16 8z"/>
+  <path d="M15.41 19.892c.419.359.468.991.108 1.41-.359.419-.991.468-1.41.108l-1.519-1.302c-.419-.359-.468-.991-.108-1.41.359-.419.991-.468 1.41-.108l1.519 1.302zm-8.127-1.507c-.304.46-.925.587-1.386.283-.46-.305-.587-.925-.283-1.386l1.103-1.669c.305-.461.925-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm23 0c-.305.46-.926.587-1.387.283-.46-.305-.587-.925-.282-1.386l1.103-1.669c.305-.461.926-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm-6.103-3.606c.11.541-.239 1.069-.78 1.18-.541.11-1.069-.239-1.18-.78l-.399-1.96c-.11-.541.238-1.069.78-1.179.541-.111 1.069.239 1.179.78l.4 1.959zm-7.54-3.958c-.345-.14-.511-.534-.37-.879.14-.344.534-.51.878-.37l1.249.509c.345.14.51.533.37.878-.141.345-.534.511-.879.37l-1.248-.508zm-9.296 1.567c-.307.211-.727.133-.938-.175-.21-.307-.132-.727.175-.937l1.113-.762c.307-.21.726-.132.937.175.21.307.132.727-.175.938l-1.112.761zm13.593 8.545c-.551-.036-.969-.513-.933-1.064.037-.55.513-.968 1.062-.933l1.997.131c.55.035.969.512.933 1.062-.035.551-.511.97-1.062.933l-1.997-.129zm-9.241-6.386c-.512-.208-.758-.793-.549-1.304.209-.511.793-.757 1.304-.549l1.853.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.853-.754zm15.945-2.726c-.346-.14-.512-.534-.37-.879.14-.344.534-.51.878-.37l1.25.509c.344.14.51.533.369.878-.141.345-.533.511-.879.37l-1.248-.508z" fill="#CCD6DD"/>
+</svg>
diff --git a/public/emoji/1f365_border.svg b/public/emoji/1f365_border.svg
new file mode 100644
index 000000000..278cebd43
--- /dev/null
+++ b/public/emoji/1f365_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M22.235 35.662c-.418 0-.83-.123-1.182-.361l-2.96-2.007-2.959 2.007c-.354.238-.766.361-1.184.361-.183 0-.365-.023-.546-.072-.589-.156-1.084-.562-1.351-1.113l-1.721-2.393-3.405-.568c-.05.003-.101.005-.151.005-.558 0-1.096-.222-1.491-.617-.433-.435-.657-1.032-.614-1.642l.256-3.567-3.215-1.56c-.551-.266-.958-.762-1.116-1.353-.159-.591-.053-1.221.291-1.729l1.152-2.928-1.152-2.991c-.343-.507-.45-1.137-.291-1.729.159-.589.565-1.084 1.116-1.351l3.215-1.561-.254-3.564c-.043-.612.181-1.212.614-1.642.395-.397.933-.618 1.491-.618.05 0 .101 0 .151.004l3.28-.506 1.846-2.452c.267-.551.761-.958 1.351-1.116.181-.048.363-.073.546-.073.418 0 .83.125 1.184.363l2.959 2.005 2.96-2.005c.352-.239.764-.363 1.182-.363.183 0 .369.025.545.073.592.159 1.088.565 1.354 1.116L26 4.042l3.262.631c.048-.004.1-.004.149-.004.558 0 1.094.221 1.493.618.431.43.656 1.03.612 1.642l-.26 3.565 3.221 1.561c.551.267.957.761 1.113 1.351.158.592.055 1.223-.289 1.729l-.926 2.908.926 3.011c.344.508.447 1.138.289 1.729-.156.591-.562 1.087-1.113 1.353l-3.221 1.56.26 3.567c.044.609-.182 1.206-.612 1.642-.399.396-.935.617-1.493.617-.049 0-.101-.002-.149-.005l-3.22.526-1.908 2.435c-.266.551-.762.957-1.354 1.113-.176.049-.362.071-.545.071z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.5 28.709c-3.708.041-8.167-2.875-7.792-8.37.133-1.959.903-3.779 2.341-5.116 2.543-2.365 6.538-2.219 8.903.324.986 1.061 1.5 2.443 1.447 3.891-.052 1.447-.665 2.788-1.727 3.774-.918.853-2.104 1.302-3.365 1.253-1.253-.046-2.413-.577-3.266-1.495-.785-.844-1.059-2.045-.733-3.214.331-1.188 1.219-2.095 2.375-2.425.532-.151 1.123-.236 1.275.294.152.531-.38.757-1.083 1.25-.833.584-1.292 1.667-.368 2.733.471.544 1.155.831 1.874.857.716.024 1.405-.228 1.931-.719.669-.622 1.057-1.469 1.09-2.383.033-.914-.292-1.786-.914-2.456-1.615-1.736-4.34-1.836-6.077-.221-1.046.973-1.652 2.295-1.704 3.724-.052 1.429.455 2.791 1.428 3.838 1.202 1.293 2.835 2.04 4.6 2.104 1.764.07 3.447-.562 4.74-1.765 1.588-1.476 2.506-3.483 2.585-5.649.079-2.167-.691-4.234-2.167-5.822-3.725-4.008-8.601-4.952-13.643-1.91-.763.463-1.401 1.139-1.833.794-.208-.167-.314-.481.09-.857 4.815-4.478 12.376-4.201 16.851.614 1.84 1.979 2.919 4.562 2.7 7.257-.683 8.403-6.558 9.861-9.558 9.695z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M22.235 35.662c-.418 0-.83-.123-1.182-.361l-2.96-2.007-2.959 2.007c-.354.238-.766.361-1.184.361-.183 0-.365-.023-.546-.072-.589-.156-1.084-.562-1.351-1.113l-1.721-2.393-3.405-.568c-.05.003-.101.005-.151.005-.558 0-1.096-.222-1.491-.617-.433-.435-.657-1.032-.614-1.642l.256-3.567-3.215-1.56c-.551-.266-.958-.762-1.116-1.353-.159-.591-.053-1.221.291-1.729l1.152-2.928-1.152-2.991c-.343-.507-.45-1.137-.291-1.729.159-.589.565-1.084 1.116-1.351l3.215-1.561-.254-3.564c-.043-.612.181-1.212.614-1.642.395-.397.933-.618 1.491-.618.05 0 .101 0 .151.004l3.28-.506 1.846-2.452c.267-.551.761-.958 1.351-1.116.181-.048.363-.073.546-.073.418 0 .83.125 1.184.363l2.959 2.005 2.96-2.005c.352-.239.764-.363 1.182-.363.183 0 .369.025.545.073.592.159 1.088.565 1.354 1.116L26 4.042l3.262.631c.048-.004.1-.004.149-.004.558 0 1.094.221 1.493.618.431.43.656 1.03.612 1.642l-.26 3.565 3.221 1.561c.551.267.957.761 1.113 1.351.158.592.055 1.223-.289 1.729l-.926 2.908.926 3.011c.344.508.447 1.138.289 1.729-.156.591-.562 1.087-1.113 1.353l-3.221 1.56.26 3.567c.044.609-.182 1.206-.612 1.642-.399.396-.935.617-1.493.617-.049 0-.101-.002-.149-.005l-3.22.526-1.908 2.435c-.266.551-.762.957-1.354 1.113-.176.049-.362.071-.545.071z"/>
+  <path fill="#D372B8" d="M18.5 28.709c-3.708.041-8.167-2.875-7.792-8.37.133-1.959.903-3.779 2.341-5.116 2.543-2.365 6.538-2.219 8.903.324.986 1.061 1.5 2.443 1.447 3.891-.052 1.447-.665 2.788-1.727 3.774-.918.853-2.104 1.302-3.365 1.253-1.253-.046-2.413-.577-3.266-1.495-.785-.844-1.059-2.045-.733-3.214.331-1.188 1.219-2.095 2.375-2.425.532-.151 1.123-.236 1.275.294.152.531-.38.757-1.083 1.25-.833.584-1.292 1.667-.368 2.733.471.544 1.155.831 1.874.857.716.024 1.405-.228 1.931-.719.669-.622 1.057-1.469 1.09-2.383.033-.914-.292-1.786-.914-2.456-1.615-1.736-4.34-1.836-6.077-.221-1.046.973-1.652 2.295-1.704 3.724-.052 1.429.455 2.791 1.428 3.838 1.202 1.293 2.835 2.04 4.6 2.104 1.764.07 3.447-.562 4.74-1.765 1.588-1.476 2.506-3.483 2.585-5.649.079-2.167-.691-4.234-2.167-5.822-3.725-4.008-8.601-4.952-13.643-1.91-.763.463-1.401 1.139-1.833.794-.208-.167-.314-.481.09-.857 4.815-4.478 12.376-4.201 16.851.614 1.84 1.979 2.919 4.562 2.7 7.257-.683 8.403-6.558 9.861-9.558 9.695z"/>
+</svg>
diff --git a/public/emoji/1f373_border.svg b/public/emoji/1f373_border.svg
new file mode 100644
index 000000000..56b1ef9e6
--- /dev/null
+++ b/public/emoji/1f373_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M34.238 27.931c-.704-.703-3.857-2.661-6.935-4.364C28.999 21.137 30 18.187 30 15c0-8.284-6.716-15-15-15C6.715 0 0 6.716 0 15c0 8.284 6.715 15 15 15 3.159 0 6.086-.981 8.504-2.649 1.705 3.081 3.666 6.24 4.37 6.944C29.288 35.709 31 36.002 32 36c1.177-.002 4.055-2.881 4-4-.049-.999-.348-2.655-1.762-4.069z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="15" cy="15" r="12" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 25c4.863-1.533 4-5 4-9s4.001-6.708.334-9.75c-2.177-1.806-6.75-2.417-8.875-1.625C9.506 5.352 7 6.833 7 9.833s-.058 2.927-1.708 5.625C2.667 19.75 9.125 27.167 16 25z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13" cy="18" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M34.238 27.931c-.704-.703-3.857-2.661-6.935-4.364C28.999 21.137 30 18.187 30 15c0-8.284-6.716-15-15-15C6.715 0 0 6.716 0 15c0 8.284 6.715 15 15 15 3.159 0 6.086-.981 8.504-2.649 1.705 3.081 3.666 6.24 4.37 6.944C29.288 35.709 31 36.002 32 36c1.177-.002 4.055-2.881 4-4-.049-.999-.348-2.655-1.762-4.069z"/>
+  <circle fill="#66757F" cx="15" cy="15" r="12"/>
+  <path fill="#F5F8FA" d="M16 25c4.863-1.533 4-5 4-9s4.001-6.708.334-9.75c-2.177-1.806-6.75-2.417-8.875-1.625C9.506 5.352 7 6.833 7 9.833s-.058 2.927-1.708 5.625C2.667 19.75 9.125 27.167 16 25z"/>
+  <circle fill="#FFAC33" cx="13" cy="18" r="4"/>
+</svg>
diff --git a/public/emoji/1f393_border.svg b/public/emoji/1f393_border.svg
new file mode 100644
index 000000000..1af6e6fdb
--- /dev/null
+++ b/public/emoji/1f393_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M24 14H12s-5 6-5 10 11 11 11 11 11-7 11-11-5-10-5-10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.902.704 2.377.704 3.278 0l14.722-11.495c.902-.704.902-1.856 0-2.56L19.64 1.28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.901.704 2.377.704 3.278 0l14.723-11.495c.901-.704.901-1.856 0-2.56L19.64 1.28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 25s-2 2-2 3v6s0 2 2 2 2-2 2-2v-6c0-1-2-3-2-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="8" cy="26" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8.001 27c-.552 0-1-.447-1-1v-3.958c-.042-.634.187-2.036 1.317-2.884l9.022-7.91c.416-.365 1.048-.323 1.411.093.364.415.322 1.047-.093 1.411l-9.08 7.958C8.974 21.166 9 21.982 9 21.99L9.002 26c0 .553-.448 1-1.001 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="13" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M24 14H12s-5 6-5 10 11 11 11 11 11-7 11-11-5-10-5-10z"/>
+  <path fill="#292F33" d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.902.704 2.377.704 3.278 0l14.722-11.495c.902-.704.902-1.856 0-2.56L19.64 1.28z"/>
+  <path fill="#394146" d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.901.704 2.377.704 3.278 0l14.723-11.495c.901-.704.901-1.856 0-2.56L19.64 1.28z"/>
+  <path fill="#FCAB40" d="M8 25s-2 2-2 3v6s0 2 2 2 2-2 2-2v-6c0-1-2-3-2-3z"/>
+  <circle fill="#FDD888" cx="8" cy="26" r="3"/>
+  <path fill="#FCAB40" d="M8.001 27c-.552 0-1-.447-1-1v-3.958c-.042-.634.187-2.036 1.317-2.884l9.022-7.91c.416-.365 1.048-.323 1.411.093.364.415.322 1.047-.093 1.411l-9.08 7.958C8.974 21.166 9 21.982 9 21.99L9.002 26c0 .553-.448 1-1.001 1z"/>
+  <circle fill="#31373D" cx="18" cy="13" r="3"/>
+</svg>
diff --git a/public/emoji/1f3a4_border.svg b/public/emoji/1f3a4_border.svg
new file mode 100644
index 000000000..78f546247
--- /dev/null
+++ b/public/emoji/1f3a4_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35.999 11.917c0 3.803-3.082 6.885-6.885 6.885-3.802 0-6.884-3.082-6.884-6.885 0-3.802 3.082-6.884 6.884-6.884 3.803 0 6.885 3.082 6.885 6.884z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.81 18.568c-.336.336-.881.336-1.217 0L22.466 9.44c-.336-.336-.336-.881 0-1.217l1.217-1.217c.336-.336.881-.336 1.217 0l9.127 9.128c.336.336.336.881 0 1.217l-1.217 1.217zm-6.071.136l-4.325-4.327c-.778-.779-1.995-.733-2.719.101l-9.158 10.574c-1.219 1.408-1.461 3.354-.711 4.73l-4.911 4.912 1.409 1.409 4.877-4.877c1.381.84 3.411.609 4.862-.648l10.575-9.157c.834-.723.881-1.94.101-2.717z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4 6v8.122C3.686 14.047 3.352 14 3 14c-1.657 0-3 .896-3 2s1.343 2 3 2 3-.896 3-2V9.889l5 2.222v5.011c-.314-.075-.648-.122-1-.122-1.657 0-3 .896-3 2s1.343 2 3 2 2.999-.896 3-2v-9L4 6zm14-5v8.123C17.685 9.048 17.353 9 17 9c-1.657 0-3 .895-3 2 0 1.104 1.343 2 3 2 1.656 0 3-.896 3-2V1h-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M35.999 11.917c0 3.803-3.082 6.885-6.885 6.885-3.802 0-6.884-3.082-6.884-6.885 0-3.802 3.082-6.884 6.884-6.884 3.803 0 6.885 3.082 6.885 6.884z"/>
+  <path fill="#31373D" d="M32.81 18.568c-.336.336-.881.336-1.217 0L22.466 9.44c-.336-.336-.336-.881 0-1.217l1.217-1.217c.336-.336.881-.336 1.217 0l9.127 9.128c.336.336.336.881 0 1.217l-1.217 1.217zm-6.071.136l-4.325-4.327c-.778-.779-1.995-.733-2.719.101l-9.158 10.574c-1.219 1.408-1.461 3.354-.711 4.73l-4.911 4.912 1.409 1.409 4.877-4.877c1.381.84 3.411.609 4.862-.648l10.575-9.157c.834-.723.881-1.94.101-2.717z"/>
+  <path fill="#55ACEE" d="M4 6v8.122C3.686 14.047 3.352 14 3 14c-1.657 0-3 .896-3 2s1.343 2 3 2 3-.896 3-2V9.889l5 2.222v5.011c-.314-.075-.648-.122-1-.122-1.657 0-3 .896-3 2s1.343 2 3 2 2.999-.896 3-2v-9L4 6zm14-5v8.123C17.685 9.048 17.353 9 17 9c-1.657 0-3 .895-3 2 0 1.104 1.343 2 3 2 1.656 0 3-.896 3-2V1h-2z"/>
+</svg>
diff --git a/public/emoji/1f3a5_border.svg b/public/emoji/1f3a5_border.svg
new file mode 100644
index 000000000..cb4415635
--- /dev/null
+++ b/public/emoji/1f3a5_border.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M32 21v1h-2v-1c0-.446-.09-.867-.225-1.268 2.446-.757 4.224-3.038 4.224-5.733 0-3.314-2.687-6-6-6-1.603 0-3.055.632-4.131 1.656C23.241 6.433 20.405 4 17 4c-3.866 0-7 3.134-7 7 0 2.551 1.369 4.777 3.409 6H13c-2.209 0-4 1.791-4 4H8l-6-4H1v14h1l6-4h1v2c0 2.209 1.791 4 4 4h13c2.209 0 4-1.791 4-4v-3h2v1h3v-6h-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22 11c0 2.761-2.239 5-5 5s-5-2.239-5-5 2.239-5 5-5 5 2.238 5 5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="17" cy="11" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="27.999" cy="14" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="27.999" cy="14" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 20h10v10H17z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19 22h6v6h-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="12.999" cy="28" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M32 21v1h-2v-1c0-.446-.09-.867-.225-1.268 2.446-.757 4.224-3.038 4.224-5.733 0-3.314-2.687-6-6-6-1.603 0-3.055.632-4.131 1.656C23.241 6.433 20.405 4 17 4c-3.866 0-7 3.134-7 7 0 2.551 1.369 4.777 3.409 6H13c-2.209 0-4 1.791-4 4H8l-6-4H1v14h1l6-4h1v2c0 2.209 1.791 4 4 4h13c2.209 0 4-1.791 4-4v-3h2v1h3v-6h-3z"/>
+  <path fill="#66757F" d="M22 11c0 2.761-2.239 5-5 5s-5-2.239-5-5 2.239-5 5-5 5 2.238 5 5z"/>
+  <circle fill="#CCD6DD" cx="17" cy="11" r="2"/>
+  <circle fill="#66757F" cx="27.999" cy="14" r="4"/>
+  <circle fill="#CCD6DD" cx="27.999" cy="14" r="2"/>
+  <path fill="#8899A6" d="M17 20h10v10H17z"/>
+  <path fill="#31373D" d="M19 22h6v6h-6z"/>
+  <circle fill="#8899A6" cx="12.999" cy="28" r="2"/>
+</svg>
diff --git a/public/emoji/1f3a9_border.svg b/public/emoji/1f3a9_border.svg
new file mode 100644
index 000000000..87671f0ee
--- /dev/null
+++ b/public/emoji/1f3a9_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M30.198 27.385L32 3.816c0-.135-.008-.263-.021-.373.003-.033.021-.075.021-.11C32 1.529 25.731.066 18 .066c-7.732 0-14 1.462-14 3.267 0 .035.017.068.022.102-.014.11-.022.23-.022.365l1.802 23.585C2.298 28.295 0 29.576 0 31c0 2.762 8.611 5 18 5s18-2.238 18-5c0-1.424-2.298-2.705-5.802-3.615z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.536 6.595c-4.89 0-8.602-.896-10.852-1.646-.524-.175-.808-.741-.633-1.265.175-.524.739-.808 1.265-.633 2.889.963 10.762 2.891 21.421-.016.529-.142 1.082.168 1.227.702.146.533-.169 1.083-.702 1.228-4.406 1.202-8.347 1.63-11.726 1.63z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M30.198 27.385l.446-5.829c-7.705 2.157-17.585 2.207-25.316-.377l.393 5.142c.069.304.113.65.113 1.076 0 1.75 1.289 2.828 2.771 3.396 4.458 1.708 13.958 1.646 18.807.149 1.467-.453 2.776-1.733 2.776-3.191 0-.119.015-.241.024-.361l-.014-.005z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M30.198 27.385L32 3.816c0-.135-.008-.263-.021-.373.003-.033.021-.075.021-.11C32 1.529 25.731.066 18 .066c-7.732 0-14 1.462-14 3.267 0 .035.017.068.022.102-.014.11-.022.23-.022.365l1.802 23.585C2.298 28.295 0 29.576 0 31c0 2.762 8.611 5 18 5s18-2.238 18-5c0-1.424-2.298-2.705-5.802-3.615z"/>
+  <path fill="#66757F" d="M17.536 6.595c-4.89 0-8.602-.896-10.852-1.646-.524-.175-.808-.741-.633-1.265.175-.524.739-.808 1.265-.633 2.889.963 10.762 2.891 21.421-.016.529-.142 1.082.168 1.227.702.146.533-.169 1.083-.702 1.228-4.406 1.202-8.347 1.63-11.726 1.63z"/>
+  <path fill="#744EAA" d="M30.198 27.385l.446-5.829c-7.705 2.157-17.585 2.207-25.316-.377l.393 5.142c.069.304.113.65.113 1.076 0 1.75 1.289 2.828 2.771 3.396 4.458 1.708 13.958 1.646 18.807.149 1.467-.453 2.776-1.733 2.776-3.191 0-.119.015-.241.024-.361l-.014-.005z"/>
+</svg>
diff --git a/public/emoji/1f3ae_border.svg b/public/emoji/1f3ae_border.svg
new file mode 100644
index 000000000..4a17797b1
--- /dev/null
+++ b/public/emoji/1f3ae_border.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M2.13 14.856l-.004-.002S.075 27.271.075 29.061c0 1.824 1.343 3.302 3 3.302.68 0 1.3-.258 1.803-.678l10.166-8.938L2.13 14.856zm31.69 0l.004-.002s2.051 12.417 2.051 14.207c0 1.824-1.343 3.302-3 3.302-.68 0-1.3-.258-1.803-.678l-10.166-8.938 12.914-7.891z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <g stroke="white" stroke-linejoin="round" stroke-width="4px">
+      <circle cx="25.975" cy="15.551" r="8.5"/>
+      <circle cx="9.975" cy="15.551" r="8.5"/>
+      <path d="M9.975 7.051h16v16.87h-16z"/>
+    </g>
+    <circle cx="13.075" cy="23.301" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="22.875" cy="23.301" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="22.875" cy="23.301" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13.075" cy="23.301" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25.735" cy="11.133" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25.735" cy="17.607" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="22.498" cy="14.37" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="28.972" cy="14.37" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.148 12.514v-2.168c0-.279-.226-.505-.505-.505H9.085c-.279 0-.505.226-.505.505v2.168l1.284 1.285 1.284-1.285zm-2.569 3.63v2.168c0 .279.226.505.505.505h1.558c.279 0 .505-.226.505-.505v-2.168l-1.284-1.285-1.284 1.285zm5.269-3.1H11.68l-1.285 1.285 1.285 1.285h2.168c.279 0 .505-.227.505-.505V13.55c0-.279-.226-.506-.505-.506zm-5.799 0H5.88c-.279 0-.505.227-.505.505v1.558c0 .279.226.505.505.505h2.168l1.285-1.285-1.284-1.283z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M2.13 14.856l-.004-.002S.075 27.271.075 29.061c0 1.824 1.343 3.302 3 3.302.68 0 1.3-.258 1.803-.678l10.166-8.938L2.13 14.856zm31.69 0l.004-.002s2.051 12.417 2.051 14.207c0 1.824-1.343 3.302-3 3.302-.68 0-1.3-.258-1.803-.678l-10.166-8.938 12.914-7.891z"/>
+  <g fill="#14171A">
+    <circle cx="25.975" cy="15.551" r="8.5"/>
+    <circle cx="9.975" cy="15.551" r="8.5"/>
+    <path d="M9.975 7.051h16v16.87h-16z"/>
+  </g>
+  <circle fill="#14171A" cx="13.075" cy="23.301" r="5"/>
+  <circle fill="#14171A" cx="22.875" cy="23.301" r="5"/>
+  <circle fill="#67757F" cx="22.875" cy="23.301" r="3"/>
+  <circle fill="#67757F" cx="13.075" cy="23.301" r="3"/>
+  <circle fill="#FFCC4D" cx="25.735" cy="11.133" r="1.603"/>
+  <circle fill="#77B255" cx="25.735" cy="17.607" r="1.603"/>
+  <circle fill="#50A5E6" cx="22.498" cy="14.37" r="1.603"/>
+  <circle fill="#DD2E44" cx="28.972" cy="14.37" r="1.603"/>
+  <path d="M11.148 12.514v-2.168c0-.279-.226-.505-.505-.505H9.085c-.279 0-.505.226-.505.505v2.168l1.284 1.285 1.284-1.285zm-2.569 3.63v2.168c0 .279.226.505.505.505h1.558c.279 0 .505-.226.505-.505v-2.168l-1.284-1.285-1.284 1.285zm5.269-3.1H11.68l-1.285 1.285 1.285 1.285h2.168c.279 0 .505-.227.505-.505V13.55c0-.279-.226-.506-.505-.506zm-5.799 0H5.88c-.279 0-.505.227-.505.505v1.558c0 .279.226.505.505.505h2.168l1.285-1.285-1.284-1.283z" fill="#8899A6"/>
+</svg>
diff --git a/public/emoji/1f3b1_border.svg b/public/emoji/1f3b1_border.svg
new file mode 100644
index 000000000..59dc9e819
--- /dev/null
+++ b/public/emoji/1f3b1_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="18" r="9" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.703 20.203c0-1.406.773-2.443 1.881-3.041-.826-.598-1.336-1.406-1.336-2.514 0-2.057 1.705-3.375 3.797-3.375 2.039 0 3.814 1.301 3.814 3.375 0 .984-.492 1.969-1.354 2.514 1.195.598 1.881 1.688 1.881 3.041 0 2.443-1.986 4.008-4.342 4.008-2.425 0-4.341-1.652-4.341-4.008zm2.742-.176c0 .896.527 1.758 1.6 1.758 1.002 0 1.6-.861 1.6-1.758 0-1.107-.633-1.758-1.6-1.758-1.02.001-1.6.774-1.6 1.758zm.334-5.097c0 .791.457 1.336 1.266 1.336.809 0 1.283-.545 1.283-1.336 0-.756-.457-1.336-1.283-1.336-.826 0-1.266.58-1.266 1.336z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#31373D" cx="18" cy="18" r="18"/>
+  <circle fill="#E1E8ED" cx="18" cy="18" r="9"/>
+  <path fill="#31373D" d="M13.703 20.203c0-1.406.773-2.443 1.881-3.041-.826-.598-1.336-1.406-1.336-2.514 0-2.057 1.705-3.375 3.797-3.375 2.039 0 3.814 1.301 3.814 3.375 0 .984-.492 1.969-1.354 2.514 1.195.598 1.881 1.688 1.881 3.041 0 2.443-1.986 4.008-4.342 4.008-2.425 0-4.341-1.652-4.341-4.008zm2.742-.176c0 .896.527 1.758 1.6 1.758 1.002 0 1.6-.861 1.6-1.758 0-1.107-.633-1.758-1.6-1.758-1.02.001-1.6.774-1.6 1.758zm.334-5.097c0 .791.457 1.336 1.266 1.336.809 0 1.283-.545 1.283-1.336 0-.756-.457-1.336-1.283-1.336-.826 0-1.266.58-1.266 1.336z"/>
+</svg>
diff --git a/public/emoji/1f3b3_border.svg b/public/emoji/1f3b3_border.svg
new file mode 100644
index 000000000..71daa085f
--- /dev/null
+++ b/public/emoji/1f3b3_border.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M22 10c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C14 22.417 16 29 17 31h6c1-2 3-8.583 3-11.916C26 15 22 13 22 10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 10h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32 13c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C24 25.417 26 32 27 34h6c1-2 3-8.583 3-11.916C36 18 32 16 32 13z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 13h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="12.562" cy="23.438" r="12.562" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="12.915" cy="18.79" r="2.316" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6.505" cy="20.938" r="2.316" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11.431" cy="28.053" r="2.316" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M22 10c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C14 22.417 16 29 17 31h6c1-2 3-8.583 3-11.916C26 15 22 13 22 10z"/>
+  <path fill="#BE1931" d="M18 10h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z"/>
+  <path fill="#CCD6DD" d="M32 13c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C24 25.417 26 32 27 34h6c1-2 3-8.583 3-11.916C36 18 32 16 32 13z"/>
+  <path fill="#BE1931" d="M28 13h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z"/>
+  <circle fill="#31373D" cx="12.562" cy="23.438" r="12.562"/>
+  <circle cx="12.915" cy="18.79" r="2.316"/>
+  <circle cx="6.505" cy="20.938" r="2.316"/>
+  <circle cx="11.431" cy="28.053" r="2.316"/>
+</svg>
diff --git a/public/emoji/1f3bc_border.svg b/public/emoji/1f3bc_border.svg
new file mode 100644
index 000000000..f7aafddac
--- /dev/null
+++ b/public/emoji/1f3bc_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 5V3H0v30h36v-2H6v-5h30v-2H6v-5h30v-2H6v-5h30v-2H6V5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.827 20.562c-.223-.646-.543-1.227-.947-1.723-.411-.513-.926-.928-1.529-1.232-.61-.31-1.259-.46-1.981-.46-.086 0-.208.009-.366.026l-.533-2.593c.613-.603 1.156-1.299 1.616-2.077.499-.847.885-1.77 1.145-2.741.269-.978.399-1.942.399-2.945 0-2.106-.542-3.94-1.627-5.475-.158-.196-.288-.343-.387-.431-.394-.355-.788-.412-1.704.266-.47.352-.883.86-1.224 1.506-.352.644-.608 1.366-.786 2.2-.185.826-.283 1.723-.292 2.684.041 1.352.234 2.701.576 4.013-.77.779-1.392 1.43-1.881 1.951-.521.569-1.038 1.222-1.539 1.943-.495.711-.91 1.493-1.233 2.324-.317.807-.497 1.693-.533 2.655.008.982.195 1.944.561 2.864.365.902.884 1.726 1.546 2.45.665.718 1.448 1.287 2.325 1.694 1.23.569 2.644.749 4.02.51.063.288.146.629.244 1.022.157.647.274 1.172.35 1.56.073.391.109.766.109 1.122 0 .541-.059.955-.197 1.301-.05.202-.185.412-.401.62-.233.227-.508.401-.839.533-.468.184-.922.231-1.289.181.195-.105.375-.241.537-.405.433-.443.652-.988.652-1.622 0-.447-.109-.875-.328-1.282-.215-.375-.508-.684-.886-.929-.378-.225-.778-.341-1.226-.341h-.006c-.512.034-.954.195-1.301.471-.36.266-.646.619-.852 1.051-.193.406-.307.847-.338 1.362.04 1.04.477 1.885 1.306 2.508.784.581 1.707.877 2.739.877.743 0 1.434-.164 2.053-.487.634-.326 1.148-.796 1.529-1.402.37-.602.559-1.291.559-2.046 0-.495-.043-.96-.129-1.419-.085-.458-.211-1.08-.384-1.869-.124-.535-.219-.987-.288-1.35.965-.428 1.712-1.049 2.226-1.85.576-.898.867-1.908.867-3-.001-.665-.112-1.342-.333-2.015zm-3.122 5.178l-1.047-5.149c.261.056.502.147.727.276.396.224.703.529.945.938.241.39.392.838.456 1.303 0 1.246-.354 2.115-1.081 2.632zM23.547 7.101c-.181.526-.43 1.057-.743 1.577-.307.517-.629.973-.959 1.359-.105.125-.202.231-.288.322-.078-.354-.128-.746-.149-1.165.016-.685.116-1.364.305-2.081.17-.661.408-1.259.695-1.756.305-.468.621-.705.944-.705.115 0 .196.028.259.087.07.071.119.208.15.454.03.133.047.303.047.494 0 .443-.088.918-.261 1.414zM18.602 18.58c.653-.943 1.452-1.837 2.431-2.718l.339 1.739c-.717.362-1.321.9-1.801 1.61-.552.82-.846 1.727-.872 2.717.017.913.309 1.736.871 2.451.566.708 1.294 1.181 2.169 1.4l.12.03.122-.029c.537-.127.594-.471.594-.613 0-.345-.224-.621-.579-.72-.367-.17-.637-.417-.82-.758-.202-.368-.309-.713-.309-.994 0-.476.17-.903.516-1.303.214-.242.432-.432.654-.572l1.093 5.508c-.382.081-.733.132-1.046.152-1.384-.045-2.518-.5-3.369-1.35-.434-.442-.747-.907-.958-1.423-.213-.516-.327-1.059-.342-1.584.029-1.27.429-2.463 1.187-3.543z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M36 5V3H0v30h36v-2H6v-5h30v-2H6v-5h30v-2H6v-5h30v-2H6V5z"/>
+  <path fill="#31373D" d="M27.827 20.562c-.223-.646-.543-1.227-.947-1.723-.411-.513-.926-.928-1.529-1.232-.61-.31-1.259-.46-1.981-.46-.086 0-.208.009-.366.026l-.533-2.593c.613-.603 1.156-1.299 1.616-2.077.499-.847.885-1.77 1.145-2.741.269-.978.399-1.942.399-2.945 0-2.106-.542-3.94-1.627-5.475-.158-.196-.288-.343-.387-.431-.394-.355-.788-.412-1.704.266-.47.352-.883.86-1.224 1.506-.352.644-.608 1.366-.786 2.2-.185.826-.283 1.723-.292 2.684.041 1.352.234 2.701.576 4.013-.77.779-1.392 1.43-1.881 1.951-.521.569-1.038 1.222-1.539 1.943-.495.711-.91 1.493-1.233 2.324-.317.807-.497 1.693-.533 2.655.008.982.195 1.944.561 2.864.365.902.884 1.726 1.546 2.45.665.718 1.448 1.287 2.325 1.694 1.23.569 2.644.749 4.02.51.063.288.146.629.244 1.022.157.647.274 1.172.35 1.56.073.391.109.766.109 1.122 0 .541-.059.955-.197 1.301-.05.202-.185.412-.401.62-.233.227-.508.401-.839.533-.468.184-.922.231-1.289.181.195-.105.375-.241.537-.405.433-.443.652-.988.652-1.622 0-.447-.109-.875-.328-1.282-.215-.375-.508-.684-.886-.929-.378-.225-.778-.341-1.226-.341h-.006c-.512.034-.954.195-1.301.471-.36.266-.646.619-.852 1.051-.193.406-.307.847-.338 1.362.04 1.04.477 1.885 1.306 2.508.784.581 1.707.877 2.739.877.743 0 1.434-.164 2.053-.487.634-.326 1.148-.796 1.529-1.402.37-.602.559-1.291.559-2.046 0-.495-.043-.96-.129-1.419-.085-.458-.211-1.08-.384-1.869-.124-.535-.219-.987-.288-1.35.965-.428 1.712-1.049 2.226-1.85.576-.898.867-1.908.867-3-.001-.665-.112-1.342-.333-2.015zm-3.122 5.178l-1.047-5.149c.261.056.502.147.727.276.396.224.703.529.945.938.241.39.392.838.456 1.303 0 1.246-.354 2.115-1.081 2.632zM23.547 7.101c-.181.526-.43 1.057-.743 1.577-.307.517-.629.973-.959 1.359-.105.125-.202.231-.288.322-.078-.354-.128-.746-.149-1.165.016-.685.116-1.364.305-2.081.17-.661.408-1.259.695-1.756.305-.468.621-.705.944-.705.115 0 .196.028.259.087.07.071.119.208.15.454.03.133.047.303.047.494 0 .443-.088.918-.261 1.414zM18.602 18.58c.653-.943 1.452-1.837 2.431-2.718l.339 1.739c-.717.362-1.321.9-1.801 1.61-.552.82-.846 1.727-.872 2.717.017.913.309 1.736.871 2.451.566.708 1.294 1.181 2.169 1.4l.12.03.122-.029c.537-.127.594-.471.594-.613 0-.345-.224-.621-.579-.72-.367-.17-.637-.417-.82-.758-.202-.368-.309-.713-.309-.994 0-.476.17-.903.516-1.303.214-.242.432-.432.654-.572l1.093 5.508c-.382.081-.733.132-1.046.152-1.384-.045-2.518-.5-3.369-1.35-.434-.442-.747-.907-.958-1.423-.213-.516-.327-1.059-.342-1.584.029-1.27.429-2.463 1.187-3.543z"/>
+</svg>
diff --git a/public/emoji/1f3d0_border.svg b/public/emoji/1f3d0_border.svg
new file mode 100644
index 000000000..c1804f2cb
--- /dev/null
+++ b/public/emoji/1f3d0_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.809 7.779c-2.156-.087-5.324.186-8.21 1.966-.009.005-.019.004-.028.009-.02.011-.031.03-.05.042-2.148 1.348-4.131 3.539-5.411 7.054-2.395-.049-4.569-.286-6.488-.715C16.789 4.13 25.77 3.83 29.699 4.337c-.91-.78-1.894-1.473-2.948-2.061-5.071.24-12.398 2.611-16.065 13.335-1.797-.578-3.319-1.35-4.534-2.312.051-.075.098-.155.128-.246C9.604 2.972 18.478.735 21.108.286 20.097.11 19.062 0 18 0c-1.037 0-2.046.107-3.035.275C11.227 2.109 6.884 5.52 4.609 11.794 3.499 10.42 3.071 9.078 2.91 8.206c-.501.771-.943 1.583-1.323 2.43.425.984 1.077 2.074 2.096 3.137 3.168 3.307 8.495 5.01 15.807 5.088.641 2.235.969 4.287 1.064 6.152-11.714.419-17.645-4.414-20.49-8.277C.035 17.155 0 17.573 0 18c0 .589.033 1.171.088 1.746 3.422 3.627 9.303 7.297 19.114 7.297.445 0 .907-.016 1.368-.032-.07 1.93-.382 3.629-.817 5.094-9.528-.256-14.941-3.361-17.932-6.255.931 1.915 2.182 3.641 3.698 5.102 3.275 1.666 7.681 2.906 13.566 3.029-.316.757-.654 1.429-.99 2.014.8-.004 1.583-.076 2.356-.181 1.828-3.749 3.305-9.756.842-17.938l-.197-.613c.91-2.363 2.181-4.011 3.592-5.144 4.465 9.084 2.105 17.699-.101 22.62.94-.37 1.837-.82 2.692-1.336 2.027-5.501 3.435-13.744-.906-22.383 1.404-.729 2.848-1.075 4.144-1.213.008.014.008.031.017.045 4.295 6.693 2.406 15.067-.073 21.119 1.599-1.536 2.906-3.364 3.853-5.399 1.399-6.064.893-11.461-1.516-15.822.486.027.91.073 1.248.122-.369-.726-.777-1.428-1.237-2.093z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#E6E7E8" cx="18" cy="18" r="18"/>
+  <path fill="#99AAB5" d="M32.809 7.779c-2.156-.087-5.324.186-8.21 1.966-.009.005-.019.004-.028.009-.02.011-.031.03-.05.042-2.148 1.348-4.131 3.539-5.411 7.054-2.395-.049-4.569-.286-6.488-.715C16.789 4.13 25.77 3.83 29.699 4.337c-.91-.78-1.894-1.473-2.948-2.061-5.071.24-12.398 2.611-16.065 13.335-1.797-.578-3.319-1.35-4.534-2.312.051-.075.098-.155.128-.246C9.604 2.972 18.478.735 21.108.286 20.097.11 19.062 0 18 0c-1.037 0-2.046.107-3.035.275C11.227 2.109 6.884 5.52 4.609 11.794 3.499 10.42 3.071 9.078 2.91 8.206c-.501.771-.943 1.583-1.323 2.43.425.984 1.077 2.074 2.096 3.137 3.168 3.307 8.495 5.01 15.807 5.088.641 2.235.969 4.287 1.064 6.152-11.714.419-17.645-4.414-20.49-8.277C.035 17.155 0 17.573 0 18c0 .589.033 1.171.088 1.746 3.422 3.627 9.303 7.297 19.114 7.297.445 0 .907-.016 1.368-.032-.07 1.93-.382 3.629-.817 5.094-9.528-.256-14.941-3.361-17.932-6.255.931 1.915 2.182 3.641 3.698 5.102 3.275 1.666 7.681 2.906 13.566 3.029-.316.757-.654 1.429-.99 2.014.8-.004 1.583-.076 2.356-.181 1.828-3.749 3.305-9.756.842-17.938l-.197-.613c.91-2.363 2.181-4.011 3.592-5.144 4.465 9.084 2.105 17.699-.101 22.62.94-.37 1.837-.82 2.692-1.336 2.027-5.501 3.435-13.744-.906-22.383 1.404-.729 2.848-1.075 4.144-1.213.008.014.008.031.017.045 4.295 6.693 2.406 15.067-.073 21.119 1.599-1.536 2.906-3.364 3.853-5.399 1.399-6.064.893-11.461-1.516-15.822.486.027.91.073 1.248.122-.369-.726-.777-1.428-1.237-2.093z"/>
+</svg>
diff --git a/public/emoji/1f3f3_border.svg b/public/emoji/1f3f3_border.svg
new file mode 100644
index 000000000..e7d03583b
--- /dev/null
+++ b/public/emoji/1f3f3_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#E1E8ED" d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z"/>
+</svg>
diff --git a/public/emoji/1f3f4_border.svg b/public/emoji/1f3f4_border.svg
new file mode 100644
index 000000000..7251ad712
--- /dev/null
+++ b/public/emoji/1f3f4_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#31373D" d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z"/>
+</svg>
diff --git a/public/emoji/1f403_border.svg b/public/emoji/1f403_border.svg
new file mode 100644
index 000000000..ed788427a
--- /dev/null
+++ b/public/emoji/1f403_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M33.912 14.37C33.588 12.602 31.976 11 30 11H11c-.239 0-.521.135-.83.365C9.664 11.139 9.129 11 8.565 11c-1 0-4.731.375-5.565 2L.691 17.305C.016 19.27 1 22.087 3.027 22.087c.57 0 1.536-.007 2.665-.017 1.65.286 3.603 1.504 5.436 2.848C13.248 29.325 14.048 36 15 36c.964 0 2.529-4.409 2.913-7h9.124c.147 2.479.771 7 1.964 7 1.016 0 3.24-4.883 4.347-12.238.315-1.625.532-3.697.615-6.319.022.17.037.352.037.557v12c0 .553.447 1 1 1s1-.447 1-1V18c0-1.807-.749-3.053-2.088-3.63z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6" cy="16" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 15c3 0 6.708-1.625 6.708-5.625 0-2-1.552-4.101-4.458-4.167C8.128 5.116 6.375 8 7 8.375 7.528 8.692 9 6.5 11.5 7c1.861.372 2.054 1.567 1.667 2.333C12.716 10.226 11 11 9 11s-1 4 1 4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M33.912 14.37C33.588 12.602 31.976 11 30 11H11c-.239 0-.521.135-.83.365C9.664 11.139 9.129 11 8.565 11c-1 0-4.731.375-5.565 2L.691 17.305C.016 19.27 1 22.087 3.027 22.087c.57 0 1.536-.007 2.665-.017 1.65.286 3.603 1.504 5.436 2.848C13.248 29.325 14.048 36 15 36c.964 0 2.529-4.409 2.913-7h9.124c.147 2.479.771 7 1.964 7 1.016 0 3.24-4.883 4.347-12.238.315-1.625.532-3.697.615-6.319.022.17.037.352.037.557v12c0 .553.447 1 1 1s1-.447 1-1V18c0-1.807-.749-3.053-2.088-3.63z"/>
+  <circle fill="#FFF" cx="6" cy="16" r="1"/>
+  <path fill="#99AAB5" d="M10 15c3 0 6.708-1.625 6.708-5.625 0-2-1.552-4.101-4.458-4.167C8.128 5.116 6.375 8 7 8.375 7.528 8.692 9 6.5 11.5 7c1.861.372 2.054 1.567 1.667 2.333C12.716 10.226 11 11 9 11s-1 4 1 4z"/>
+</svg>
diff --git a/public/emoji/1f40f_border.svg b/public/emoji/1f40f_border.svg
new file mode 100644
index 000000000..fb4bbcfb3
--- /dev/null
+++ b/public/emoji/1f40f_border.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25 35c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S30 26.896 30 28c0 0-2.25 7-5 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 36c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S33 27.896 33 29c0 0-2.25 7-5 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14 35c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S17 26.896 17 28c0 0-.25 7-3 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 36c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S20 27.896 20 29c0 0-.25 7-3 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35.75 21.384c0 7.782-4.495 11.408-14.519 11.408-10.023 0-13.481-3.626-13.481-11.408 0-7.783 3.458-11.407 13.481-11.407 10.024 0 14.519 3.624 14.519 11.407z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 17.667C17 27 12.345 29 8.042 29 3.738 29 1 22.36 1 17.667 1 12.973 3.738 12 8.042 12c4.303 0 8.958.973 8.958 5.667z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="4.5" cy="20.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.75 12.75C14 16 13.622 15.356 8.622 17.356 5.545 18.587 0 18.25 0 13.5 0 11.567 3.687 11 7 11c3.314 0 10.409-1.332 8.75 1.75z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 13.696c3.353 2.427 5.43 6.139 3.724 11.089-1.367 3.967-6.816 3.115-9.616 1.127-2.799-1.988-2.643-4.792-1.733-6.291.909-1.497 4.158-1.229 6.024.097.934.663.287 1.559-.721 1.068-2.292-1.118-3.037 1.443-1.246 2.882 1.266 1.016 3.275 1.049 3.655-1.01.671-3.63-3.505-6.274-7.465-5.302C11 16 13.161 11.641 16 13.696z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M25 35c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S30 26.896 30 28c0 0-2.25 7-5 7z"/>
+  <path fill="#66757F" d="M28 36c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S33 27.896 33 29c0 0-2.25 7-5 7z"/>
+  <path fill="#292F33" d="M14 35c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S17 26.896 17 28c0 0-.25 7-3 7z"/>
+  <path fill="#66757F" d="M17 36c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S20 27.896 20 29c0 0-.25 7-3 7z"/>
+  <path fill="#E1E8ED" d="M35.75 21.384c0 7.782-4.495 11.408-14.519 11.408-10.023 0-13.481-3.626-13.481-11.408 0-7.783 3.458-11.407 13.481-11.407 10.024 0 14.519 3.624 14.519 11.407z"/>
+  <path fill="#99AAB5" d="M17 17.667C17 27 12.345 29 8.042 29 3.738 29 1 22.36 1 17.667 1 12.973 3.738 12 8.042 12c4.303 0 8.958.973 8.958 5.667z"/>
+  <circle fill="#292F33" cx="4.5" cy="20.5" r="1.5"/>
+  <path fill="#E1E8ED" d="M15.75 12.75C14 16 13.622 15.356 8.622 17.356 5.545 18.587 0 18.25 0 13.5 0 11.567 3.687 11 7 11c3.314 0 10.409-1.332 8.75 1.75z"/>
+  <path fill="#FFCC4D" d="M16 13.696c3.353 2.427 5.43 6.139 3.724 11.089-1.367 3.967-6.816 3.115-9.616 1.127-2.799-1.988-2.643-4.792-1.733-6.291.909-1.497 4.158-1.229 6.024.097.934.663.287 1.559-.721 1.068-2.292-1.118-3.037 1.443-1.246 2.882 1.266 1.016 3.275 1.049 3.655-1.01.671-3.63-3.505-6.274-7.465-5.302C11 16 13.161 11.641 16 13.696z"/>
+</svg>
diff --git a/public/emoji/1f410_border.svg b/public/emoji/1f410_border.svg
new file mode 100644
index 000000000..7a36382b5
--- /dev/null
+++ b/public/emoji/1f410_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M7.44 7.503c-1-4 3.687-6 8-4 .907.421.948 1.316 0 1-3-1-6 1-4 4 1.109 1.664-3.233 2.068-4-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.136 5.785c-1-4 3.687-6 8-4 .907.421.949 1.316 0 1-3-1-6 1-4 4 1.11 1.664-3.233 2.067-4-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 14.785c0 4-2 4.827-2 4 0-2-1 0-1-1v-3c0-1.657.671-3 1.5-3s1.5 1.343 1.5 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35.159 10.49c-.68-1.643-2.313-2.705-4.159-2.705-.553 0-1 .448-1 1s.447 1 1 1c1.034 0 1.941.577 2.312 1.471.341.824.168 1.758-.455 2.647-.984-1.506-2.602-2.618-4.856-2.618-2.391 0-7.279.714-10.828 1.289-.052-.094-.105-.188-.172-.289-2-3-4-8.157-7-8.157-4 0-10 4.986-10 9.157 0 2.544 5.738 2.929 7.486 2.988.697 1.43 1.414 2.934 2.232 4.33.066.205.155.429.282.683 3 6 3.119 14.5 4.5 14.5s2.5-4.857 2.5-9c0-.151-.004-.299-.007-.447 3.126.649 6.607.322 9.677-.61 1.448 5.045 1.77 10.058 2.83 10.058 1.342 0 2.433-8.818 2.494-13.12C33.316 21.226 34 19.51 34 17.785c0-.605-.086-1.23-.248-1.843 1.614-1.644 2.143-3.676 1.407-5.452z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="7" cy="9.285" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M7.44 7.503c-1-4 3.687-6 8-4 .907.421.948 1.316 0 1-3-1-6 1-4 4 1.109 1.664-3.233 2.068-4-1z"/>
+  <path fill="#FFCC4D" d="M6.136 5.785c-1-4 3.687-6 8-4 .907.421.949 1.316 0 1-3-1-6 1-4 4 1.11 1.664-3.233 2.067-4-1z"/>
+  <path fill="#E1E8ED" d="M5 14.785c0 4-2 4.827-2 4 0-2-1 0-1-1v-3c0-1.657.671-3 1.5-3s1.5 1.343 1.5 3z"/>
+  <path fill="#CCD6DD" d="M35.159 10.49c-.68-1.643-2.313-2.705-4.159-2.705-.553 0-1 .448-1 1s.447 1 1 1c1.034 0 1.941.577 2.312 1.471.341.824.168 1.758-.455 2.647-.984-1.506-2.602-2.618-4.856-2.618-2.391 0-7.279.714-10.828 1.289-.052-.094-.105-.188-.172-.289-2-3-4-8.157-7-8.157-4 0-10 4.986-10 9.157 0 2.544 5.738 2.929 7.486 2.988.697 1.43 1.414 2.934 2.232 4.33.066.205.155.429.282.683 3 6 3.119 14.5 4.5 14.5s2.5-4.857 2.5-9c0-.151-.004-.299-.007-.447 3.126.649 6.607.322 9.677-.61 1.448 5.045 1.77 10.058 2.83 10.058 1.342 0 2.433-8.818 2.494-13.12C33.316 21.226 34 19.51 34 17.785c0-.605-.086-1.23-.248-1.843 1.614-1.644 2.143-3.676 1.407-5.452z"/>
+  <circle fill="#292F33" cx="7" cy="9.285" r="1"/>
+</svg>
diff --git a/public/emoji/1f411_border.svg b/public/emoji/1f411_border.svg
new file mode 100644
index 000000000..dc4ddeb08
--- /dev/null
+++ b/public/emoji/1f411_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M11.983 3.562c4.543-.262 7.824 1.597 8.089 6.826.215 4.19-5.184 6.79-8.046 6.879-2.462.077-1.353-1.852.61-2.334 1.576-.387 4.124-2.413 3.602-4.44-.597-2.32-4.315-2.684-6.351.292-.798 1.167-3.554.873-4.096-.434-.958-2.309 1.211-6.502 6.192-6.789z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35.75 21.384c0-7.783-4.495-11.407-14.519-11.407-1.087 0-2.083.051-3.018.137-1.36-2.423-4.845-2.828-8.213-2.828-4.304 0-10 6.145-10 10.839 0 4.608 3.606 4.866 7.811 4.874.233 3.245 1.226 5.647 3.249 7.26C11.337 31.409 12.594 36 15 36c1.353 0 2.099-1.695 2.51-3.417 1.128.136 2.359.209 3.722.209 1.733 0 3.288-.116 4.695-.335C26.017 34.114 26.458 36 28 36c2.317 0 4.273-4.956 4.834-6.521 1.969-1.87 2.916-4.545 2.916-8.095z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="4.5" cy="15.786" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.562 4.339c4.312 1.455 5.74 4.148 4.034 9.099-1.367 3.967-7.345 4.361-10.034 3.375C9.25 15.964 11 14.589 13 14.875c1.606.23 4.727-.698 5-2.773C18.312 9.727 15 8 12 10c-1.177.785-5.774.43-5.5-.958.638-3.226 6.335-6.298 11.062-4.703z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M11.983 3.562c4.543-.262 7.824 1.597 8.089 6.826.215 4.19-5.184 6.79-8.046 6.879-2.462.077-1.353-1.852.61-2.334 1.576-.387 4.124-2.413 3.602-4.44-.597-2.32-4.315-2.684-6.351.292-.798 1.167-3.554.873-4.096-.434-.958-2.309 1.211-6.502 6.192-6.789z"/>
+  <path fill="#E1E8ED" d="M35.75 21.384c0-7.783-4.495-11.407-14.519-11.407-1.087 0-2.083.051-3.018.137-1.36-2.423-4.845-2.828-8.213-2.828-4.304 0-10 6.145-10 10.839 0 4.608 3.606 4.866 7.811 4.874.233 3.245 1.226 5.647 3.249 7.26C11.337 31.409 12.594 36 15 36c1.353 0 2.099-1.695 2.51-3.417 1.128.136 2.359.209 3.722.209 1.733 0 3.288-.116 4.695-.335C26.017 34.114 26.458 36 28 36c2.317 0 4.273-4.956 4.834-6.521 1.969-1.87 2.916-4.545 2.916-8.095z"/>
+  <circle fill="#292F33" cx="4.5" cy="15.786" r="1.5"/>
+  <path fill="#FFCC4D" d="M17.562 4.339c4.312 1.455 5.74 4.148 4.034 9.099-1.367 3.967-7.345 4.361-10.034 3.375C9.25 15.964 11 14.589 13 14.875c1.606.23 4.727-.698 5-2.773C18.312 9.727 15 8 12 10c-1.177.785-5.774.43-5.5-.958.638-3.226 6.335-6.298 11.062-4.703z"/>
+</svg>
diff --git a/public/emoji/1f413_border.svg b/public/emoji/1f413_border.svg
new file mode 100644
index 000000000..3391490df
--- /dev/null
+++ b/public/emoji/1f413_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M24.88 33.097c-.098-.18-.25-.302-.418-.391C22.865 31 24 28.999 24 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.486-.262.667-.868.404-1.354zm-7 0c-.097-.18-.25-.302-.417-.391C15.866 31 17 28.999 17 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.485-.262.666-.868.403-1.354zM7.516 10c0 1.104-1.119 2-2.5 2s-3.5-1-3.5-2 2.119-2 3.5-2c1.38 0 2.5.896 2.5 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.516 2c-2-1-3 1-3 1s0-3-3-3-3 3-3 3-3-.938-3 2c0 1.482 1.101 2.411 2.484 2.387V12c0 1 .263 3-.737 4s-2.484 4 .516 4 3-4 3-7c1 1 4 1 4-4 0-.867-.213-1.512-.55-2h1.287c4 0 4-4 2-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.516 9c4 10 0 22-13 22-7.732 0-13-6-14-11-1.177-5.883-1-8-1-12 0-2.738 2.118-4.824 5-4 7 2 5 10 12 10 10 0 8.23-11.923 11-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="7.516" cy="8" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M24.88 33.097c-.098-.18-.25-.302-.418-.391C22.865 31 24 28.999 24 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.486-.262.667-.868.404-1.354zm-7 0c-.097-.18-.25-.302-.417-.391C15.866 31 17 28.999 17 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.485-.262.666-.868.403-1.354zM7.516 10c0 1.104-1.119 2-2.5 2s-3.5-1-3.5-2 2.119-2 3.5-2c1.38 0 2.5.896 2.5 2z"/>
+  <path fill="#DD2E44" d="M13.516 2c-2-1-3 1-3 1s0-3-3-3-3 3-3 3-3-.938-3 2c0 1.482 1.101 2.411 2.484 2.387V12c0 1 .263 3-.737 4s-2.484 4 .516 4 3-4 3-7c1 1 4 1 4-4 0-.867-.213-1.512-.55-2h1.287c4 0 4-4 2-5z"/>
+  <path fill="#E1E8ED" d="M32.516 9c4 10 0 22-13 22-7.732 0-13-6-14-11-1.177-5.883-1-8-1-12 0-2.738 2.118-4.824 5-4 7 2 5 10 12 10 10 0 8.23-11.923 11-5z"/>
+  <circle fill="#292F33" cx="7.516" cy="8" r="1"/>
+</svg>
diff --git a/public/emoji/1f414_border.svg b/public/emoji/1f414_border.svg
new file mode 100644
index 000000000..ad54bd1b8
--- /dev/null
+++ b/public/emoji/1f414_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M20.143 32.215c0 1.183-.959 2.143-2.143 2.143s-2.143-.96-2.143-2.143c0-1.184.96-2.144 2.143-2.144s2.143.96 2.143 2.144z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.643 15.643C27.643 10.317 23.324 6 18 6c-5.326 0-9.643 4.317-9.643 9.643 0 5.357-1.071 16.572-1.071 16.572 0 1.183.959 2.143 2.143 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.96 2.143 2.143 2.143 1.183 0 2.142-.96 2.142-2.143h4.286c0 1.183.96 2.143 2.144 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.959 2.143 2.143 2.143 1.184 0 2.143-.96 2.143-2.143-.002 0-1.073-11.215-1.073-16.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20 3c0 2.209-1.447 6-2 6-.552 0-2-3.791-2-6s1.448-3 2-3c.553 0 2 .791 2 3zm-4.365 30c0-2.612 1.711-8 2.365-8 .653 0 2.365 5.388 2.365 8S18.652 36 18 36c-.654 0-2.365-.388-2.365-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="22.5" rx="7" ry="4.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25 22.5c0 1.5-14 1.5-14 0s4.791-4.5 7-4.5 7 3 7 4.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11.5" cy="18.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="24.5" cy="18.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M20.143 32.215c0 1.183-.959 2.143-2.143 2.143s-2.143-.96-2.143-2.143c0-1.184.96-2.144 2.143-2.144s2.143.96 2.143 2.144z"/>
+  <path fill="#E1E8ED" d="M27.643 15.643C27.643 10.317 23.324 6 18 6c-5.326 0-9.643 4.317-9.643 9.643 0 5.357-1.071 16.572-1.071 16.572 0 1.183.959 2.143 2.143 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.96 2.143 2.143 2.143 1.183 0 2.142-.96 2.142-2.143h4.286c0 1.183.96 2.143 2.144 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.959 2.143 2.143 2.143 1.184 0 2.143-.96 2.143-2.143-.002 0-1.073-11.215-1.073-16.572z"/>
+  <path fill="#DD2E44" d="M20 3c0 2.209-1.447 6-2 6-.552 0-2-3.791-2-6s1.448-3 2-3c.553 0 2 .791 2 3zm-4.365 30c0-2.612 1.711-8 2.365-8 .653 0 2.365 5.388 2.365 8S18.652 36 18 36c-.654 0-2.365-.388-2.365-3z"/>
+  <ellipse fill="#F4900C" cx="18" cy="22.5" rx="7" ry="4.5"/>
+  <path fill="#FFAC33" d="M25 22.5c0 1.5-14 1.5-14 0s4.791-4.5 7-4.5 7 3 7 4.5z"/>
+  <circle fill="#292F33" cx="11.5" cy="18.5" r="1.5"/>
+  <circle fill="#292F33" cx="24.5" cy="18.5" r="1.5"/>
+</svg>
diff --git a/public/emoji/1f41c_border.svg b/public/emoji/1f41c_border.svg
new file mode 100644
index 000000000..929f7482a
--- /dev/null
+++ b/public/emoji/1f41c_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M7.5 24.516c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.024 0-1.414L22.81 6.793c.391-.391 1.023-.391 1.414 0s.391 1.024 0 1.414L8.207 24.223c-.196.195-.452.293-.707.293zm8.282-11.738c-.219 0-.438-.071-.623-.218-.431-.344-.502-.971-.161-1.403.113-.144 2.571-3.361.971-7.572-.196-.517.063-1.094.579-1.29.518-.196 1.094.064 1.29.579 2.017 5.307-1.139 9.357-1.274 9.527-.197.248-.488.377-.782.377zm3.89 3.888c-.221 0-.441-.072-.626-.221-.429-.345-.499-.97-.156-1.4.138-.172 3.435-4.197 9.323-2.726.536.134.862.677.727 1.213-.134.535-.679.861-1.212.728-4.623-1.157-7.172 1.905-7.278 2.036-.197.243-.487.37-.778.37zM6.454 18.511c-1.096 0-2.301-.186-3.58-.671-.517-.196-.776-.773-.58-1.29.195-.517.775-.775 1.29-.58 4.219 1.604 7.439-.866 7.574-.972.434-.338 1.062-.266 1.403.166.342.432.271 1.058-.159 1.4-.129.103-2.495 1.947-5.948 1.947zm1.564-8.066c-1.829 0-4.968-.482-7.542-3.332-.37-.41-.338-1.042.072-1.412.411-.371 1.043-.337 1.412.072C4.984 9.122 8.976 8.392 9.146 8.36c.538-.105 1.066.246 1.173.787.107.54-.241 1.064-.781 1.174-.069.014-.644.124-1.52.124z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9.341 10.341c-.066 0-.132-.006-.199-.02-.541-.109-.89-.635-.783-1.175.034-.173.76-4.163-2.587-7.185C5.362 1.591 5.33.959 5.7.549 6.069.14 6.702.106 7.113.477c4.214 3.806 3.251 8.849 3.207 9.062-.096.475-.513.802-.979.802zm3.948 18.63c-.448 0-.856-.303-.969-.758-1.473-5.895 2.554-9.186 2.726-9.323.431-.344 1.061-.273 1.405.159.343.431.273 1.058-.156 1.402-.14.114-3.187 2.667-2.035 7.277.134.535-.192 1.078-.728 1.212-.081.021-.163.031-.243.031z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M29.844 19.167c-2.96-2.959-6.095-3.569-8.915-2.069-.157-1.874-1.166-4.007-2.521-5.363-1.488-1.488-3.008-1.653-4.405-1.044 1.058-2.465.6-5.43-.826-6.856-1.843-1.843-4.594-.411-7.174 2.168-2.58 2.58-4.012 5.331-2.168 7.174 1.425 1.426 4.391 1.883 6.856.826-.61 1.397-.444 2.918 1.044 4.405 1.354 1.354 3.489 2.363 5.363 2.521-1.5 2.82-.891 5.954 2.069 8.915 3.75 3.749 12.204 5.527 14.204 3.527s.223-10.455-3.527-14.204z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M7.5 24.516c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.024 0-1.414L22.81 6.793c.391-.391 1.023-.391 1.414 0s.391 1.024 0 1.414L8.207 24.223c-.196.195-.452.293-.707.293zm8.282-11.738c-.219 0-.438-.071-.623-.218-.431-.344-.502-.971-.161-1.403.113-.144 2.571-3.361.971-7.572-.196-.517.063-1.094.579-1.29.518-.196 1.094.064 1.29.579 2.017 5.307-1.139 9.357-1.274 9.527-.197.248-.488.377-.782.377zm3.89 3.888c-.221 0-.441-.072-.626-.221-.429-.345-.499-.97-.156-1.4.138-.172 3.435-4.197 9.323-2.726.536.134.862.677.727 1.213-.134.535-.679.861-1.212.728-4.623-1.157-7.172 1.905-7.278 2.036-.197.243-.487.37-.778.37zM6.454 18.511c-1.096 0-2.301-.186-3.58-.671-.517-.196-.776-.773-.58-1.29.195-.517.775-.775 1.29-.58 4.219 1.604 7.439-.866 7.574-.972.434-.338 1.062-.266 1.403.166.342.432.271 1.058-.159 1.4-.129.103-2.495 1.947-5.948 1.947zm1.564-8.066c-1.829 0-4.968-.482-7.542-3.332-.37-.41-.338-1.042.072-1.412.411-.371 1.043-.337 1.412.072C4.984 9.122 8.976 8.392 9.146 8.36c.538-.105 1.066.246 1.173.787.107.54-.241 1.064-.781 1.174-.069.014-.644.124-1.52.124z"/>
+  <path fill="#31373D" d="M9.341 10.341c-.066 0-.132-.006-.199-.02-.541-.109-.89-.635-.783-1.175.034-.173.76-4.163-2.587-7.185C5.362 1.591 5.33.959 5.7.549 6.069.14 6.702.106 7.113.477c4.214 3.806 3.251 8.849 3.207 9.062-.096.475-.513.802-.979.802zm3.948 18.63c-.448 0-.856-.303-.969-.758-1.473-5.895 2.554-9.186 2.726-9.323.431-.344 1.061-.273 1.405.159.343.431.273 1.058-.156 1.402-.14.114-3.187 2.667-2.035 7.277.134.535-.192 1.078-.728 1.212-.081.021-.163.031-.243.031z"/>
+  <path fill="#31373D" d="M29.844 19.167c-2.96-2.959-6.095-3.569-8.915-2.069-.157-1.874-1.166-4.007-2.521-5.363-1.488-1.488-3.008-1.653-4.405-1.044 1.058-2.465.6-5.43-.826-6.856-1.843-1.843-4.594-.411-7.174 2.168-2.58 2.58-4.012 5.331-2.168 7.174 1.425 1.426 4.391 1.883 6.856.826-.61 1.397-.444 2.918 1.044 4.405 1.354 1.354 3.489 2.363 5.363 2.521-1.5 2.82-.891 5.954 2.069 8.915 3.75 3.749 12.204 5.527 14.204 3.527s.223-10.455-3.527-14.204z"/>
+</svg>
diff --git a/public/emoji/1f440_border.svg b/public/emoji/1f440_border.svg
new file mode 100644
index 000000000..f25c3ca40
--- /dev/null
+++ b/public/emoji/1f440_border.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <ellipse cx="8.828" cy="18" rx="7.953" ry="13.281" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8.828 32.031C3.948 32.031.125 25.868.125 18S3.948 3.969 8.828 3.969 17.531 10.132 17.531 18s-3.823 14.031-8.703 14.031zm0-26.562C4.856 5.469 1.625 11.09 1.625 18s3.231 12.531 7.203 12.531S16.031 24.91 16.031 18 12.8 5.469 8.828 5.469z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6.594" cy="18" r="4.96" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6.594" cy="18" r="3.565" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="7.911" cy="15.443" r="1.426" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="27.234" cy="18" rx="7.953" ry="13.281" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.234 32.031c-4.88 0-8.703-6.163-8.703-14.031s3.823-14.031 8.703-14.031S35.938 10.132 35.938 18s-3.824 14.031-8.704 14.031zm0-26.562c-3.972 0-7.203 5.622-7.203 12.531 0 6.91 3.231 12.531 7.203 12.531S34.438 24.91 34.438 18 31.206 5.469 27.234 5.469z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25" cy="18" r="4.96" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25" cy="18" r="3.565" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="26.317" cy="15.443" r="1.426" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <ellipse fill="#F5F8FA" cx="8.828" cy="18" rx="7.953" ry="13.281"/>
+  <path fill="#E1E8ED" d="M8.828 32.031C3.948 32.031.125 25.868.125 18S3.948 3.969 8.828 3.969 17.531 10.132 17.531 18s-3.823 14.031-8.703 14.031zm0-26.562C4.856 5.469 1.625 11.09 1.625 18s3.231 12.531 7.203 12.531S16.031 24.91 16.031 18 12.8 5.469 8.828 5.469z"/>
+  <circle fill="#8899A6" cx="6.594" cy="18" r="4.96"/>
+  <circle fill="#292F33" cx="6.594" cy="18" r="3.565"/>
+  <circle fill="#F5F8FA" cx="7.911" cy="15.443" r="1.426"/>
+  <ellipse fill="#F5F8FA" cx="27.234" cy="18" rx="7.953" ry="13.281"/>
+  <path fill="#E1E8ED" d="M27.234 32.031c-4.88 0-8.703-6.163-8.703-14.031s3.823-14.031 8.703-14.031S35.938 10.132 35.938 18s-3.824 14.031-8.704 14.031zm0-26.562c-3.972 0-7.203 5.622-7.203 12.531 0 6.91 3.231 12.531 7.203 12.531S34.438 24.91 34.438 18 31.206 5.469 27.234 5.469z"/>
+  <circle fill="#8899A6" cx="25" cy="18" r="4.96"/>
+  <circle fill="#292F33" cx="25" cy="18" r="3.565"/>
+  <circle fill="#F5F8FA" cx="26.317" cy="15.443" r="1.426"/>
+</svg>
diff --git a/public/emoji/1f464_border.svg b/public/emoji/1f464_border.svg
new file mode 100644
index 000000000..c7393d6bd
--- /dev/null
+++ b/public/emoji/1f464_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M24 26.799v-2.566c2-1.348 4.08-3.779 4.703-6.896.186.103.206.17.413.17.991 0 1.709-1.287 1.709-2.873 0-1.562-.823-2.827-1.794-2.865.187-.674.293-1.577.293-2.735C29.324 5.168 26 .527 18.541.527c-6.629 0-10.777 4.641-10.777 8.507 0 1.123.069 2.043.188 2.755-.911.137-1.629 1.352-1.629 2.845 0 1.587.804 2.873 1.796 2.873.206 0 .025-.067.209-.17C8.952 20.453 11 22.885 13 24.232v2.414c-5 .645-12 3.437-12 6.23v1.061C1 35 2.076 35 3.137 35h29.725C33.924 35 35 35 35 33.938v-1.061c0-2.615-6-5.225-11-6.078z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#269" d="M24 26.799v-2.566c2-1.348 4.08-3.779 4.703-6.896.186.103.206.17.413.17.991 0 1.709-1.287 1.709-2.873 0-1.562-.823-2.827-1.794-2.865.187-.674.293-1.577.293-2.735C29.324 5.168 26 .527 18.541.527c-6.629 0-10.777 4.641-10.777 8.507 0 1.123.069 2.043.188 2.755-.911.137-1.629 1.352-1.629 2.845 0 1.587.804 2.873 1.796 2.873.206 0 .025-.067.209-.17C8.952 20.453 11 22.885 13 24.232v2.414c-5 .645-12 3.437-12 6.23v1.061C1 35 2.076 35 3.137 35h29.725C33.924 35 35 35 35 33.938v-1.061c0-2.615-6-5.225-11-6.078z"/>
+</svg>
diff --git a/public/emoji/1f465_border.svg b/public/emoji/1f465_border.svg
new file mode 100644
index 000000000..cc3732c4e
--- /dev/null
+++ b/public/emoji/1f465_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29 20.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.068 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13.477 2.384 2.484 4.243 3.484 5.274v1.847c-4 .492-7 2.628-7 4.765v.81c0 .812.823.812 1.634.812h18.73c.813 0 1.636 0 1.636-.812v-.81c0-2.001-3-3.997-6-4.649z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 28.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.069 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13C4.993 23.876 7 25.735 8 26.766v1.847c-4 .492-7 2.628-7 4.765v.811C1 35 1.823 35 2.634 35h18.73c.813 0 1.636 0 1.636-.812v-.811c0-2-3-3.996-6-4.648z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#55ACEE" d="M29 20.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.068 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13.477 2.384 2.484 4.243 3.484 5.274v1.847c-4 .492-7 2.628-7 4.765v.81c0 .812.823.812 1.634.812h18.73c.813 0 1.636 0 1.636-.812v-.81c0-2.001-3-3.997-6-4.649z"/>
+  <path fill="#269" d="M17 28.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.069 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13C4.993 23.876 7 25.735 8 26.766v1.847c-4 .492-7 2.628-7 4.765v.811C1 35 1.823 35 2.634 35h18.73c.813 0 1.636 0 1.636-.812v-.811c0-2-3-3.996-6-4.648z"/>
+</svg>
diff --git a/public/emoji/1f47b_border.svg b/public/emoji/1f47b_border.svg
new file mode 100644
index 000000000..80ac01215
--- /dev/null
+++ b/public/emoji/1f47b_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 11c0-1.104-.896-2-2-2s-2 .896-2 2c0 0-.011 3.285-3 3.894V12c0-6.075-4.925-11-11-11S7 5.925 7 12v3.237C1.778 16.806 0 23.231 0 27c0 1.104.896 2 2 2s2-.896 2-2c0 0 .002-3.54 3.336-3.958C7.838 27.883 8.954 33 11 33h1c4 0 3 2 7 2s3-2 6-2 2.395 2 6 2c1.657 0 3-1.343 3-3 0-.675-2.274-4.994-3.755-9.268C35.981 21.348 36 14.58 36 11z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13" cy="12" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="23" cy="12" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="23" cy="13" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22.192 19.491c2.65 1.987 3.591 5.211 2.1 7.199-1.491 1.988-4.849 1.988-7.5 0-2.65-1.987-3.591-5.211-2.1-7.199 1.492-1.989 4.849-1.988 7.5 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M36 11c0-1.104-.896-2-2-2s-2 .896-2 2c0 0-.011 3.285-3 3.894V12c0-6.075-4.925-11-11-11S7 5.925 7 12v3.237C1.778 16.806 0 23.231 0 27c0 1.104.896 2 2 2s2-.896 2-2c0 0 .002-3.54 3.336-3.958C7.838 27.883 8.954 33 11 33h1c4 0 3 2 7 2s3-2 6-2 2.395 2 6 2c1.657 0 3-1.343 3-3 0-.675-2.274-4.994-3.755-9.268C35.981 21.348 36 14.58 36 11z"/>
+  <circle fill="#292F33" cx="13" cy="12" r="2"/>
+  <circle fill="#292F33" cx="23" cy="12" r="4"/>
+  <circle fill="#9AAAB4" cx="23" cy="13" r="2"/>
+  <path fill="#292F33" d="M22.192 19.491c2.65 1.987 3.591 5.211 2.1 7.199-1.491 1.988-4.849 1.988-7.5 0-2.65-1.987-3.591-5.211-2.1-7.199 1.492-1.989 4.849-1.988 7.5 0z"/>
+</svg>
diff --git a/public/emoji/1f47d_border.svg b/public/emoji/1f47d_border.svg
new file mode 100644
index 000000000..e1d4a54d7
--- /dev/null
+++ b/public/emoji/1f47d_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35 17c0 9.389-13.223 19-17 19-3.778 0-17-9.611-17-19S8.611 0 18 0s17 7.611 17 17z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.503 14.845c3.124 3.124 4.39 6.923 2.828 8.485-1.562 1.562-5.361.297-8.485-2.828-3.125-3.124-4.391-6.923-2.828-8.485s5.361-.296 8.485 2.828zm8.994 0c-3.124 3.124-4.39 6.923-2.828 8.485 1.562 1.562 5.361.297 8.485-2.828 3.125-3.125 4.391-6.923 2.828-8.485-1.562-1.562-5.361-.297-8.485 2.828zM18 31c-2.347 0-3.575-1.16-3.707-1.293-.391-.391-.391-1.023 0-1.414.387-.387 1.013-.391 1.404-.01.051.047.806.717 2.303.717 1.519 0 2.273-.689 2.305-.719.398-.374 1.027-.363 1.408.029.379.393.38 1.011-.006 1.396C21.575 29.84 20.347 31 18 31z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M35 17c0 9.389-13.223 19-17 19-3.778 0-17-9.611-17-19S8.611 0 18 0s17 7.611 17 17z"/>
+  <path fill="#292F33" d="M13.503 14.845c3.124 3.124 4.39 6.923 2.828 8.485-1.562 1.562-5.361.297-8.485-2.828-3.125-3.124-4.391-6.923-2.828-8.485s5.361-.296 8.485 2.828zm8.994 0c-3.124 3.124-4.39 6.923-2.828 8.485 1.562 1.562 5.361.297 8.485-2.828 3.125-3.125 4.391-6.923 2.828-8.485-1.562-1.562-5.361-.297-8.485 2.828zM18 31c-2.347 0-3.575-1.16-3.707-1.293-.391-.391-.391-1.023 0-1.414.387-.387 1.013-.391 1.404-.01.051.047.806.717 2.303.717 1.519 0 2.273-.689 2.305-.719.398-.374 1.027-.363 1.408.029.379.393.38 1.011-.006 1.396C21.575 29.84 20.347 31 18 31z"/>
+</svg>
diff --git a/public/emoji/1f480_border.svg b/public/emoji/1f480_border.svg
new file mode 100644
index 000000000..8546f7b00
--- /dev/null
+++ b/public/emoji/1f480_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M34 16C34 6 26.837 0 18 0 9.164 0 2 6 2 16c0 5.574.002 10.388 6 12.64V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.155c.324.027.659.05 1 .07V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.085c.342-.021.676-.043 1-.07V33c0 1.657 1.344 3 3 3 1.657 0 3-1.343 3-3v-4.36c5.998-2.252 6-7.066 6-12.64z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11" cy="14" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25" cy="14" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19.903 23.062C19.651 22.449 18.9 22 18 22s-1.652.449-1.903 1.062c-.632.176-1.097.75-1.097 1.438 0 .828.671 1.5 1.5 1.5.655 0 1.206-.422 1.41-1.007.03.001.059.007.09.007s.06-.006.09-.007c.205.585.756 1.007 1.41 1.007.828 0 1.5-.672 1.5-1.5 0-.688-.466-1.261-1.097-1.438z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M34 16C34 6 26.837 0 18 0 9.164 0 2 6 2 16c0 5.574.002 10.388 6 12.64V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.155c.324.027.659.05 1 .07V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.085c.342-.021.676-.043 1-.07V33c0 1.657 1.344 3 3 3 1.657 0 3-1.343 3-3v-4.36c5.998-2.252 6-7.066 6-12.64z"/>
+  <circle fill="#292F33" cx="11" cy="14" r="5"/>
+  <circle fill="#292F33" cx="25" cy="14" r="5"/>
+  <path fill="#292F33" d="M19.903 23.062C19.651 22.449 18.9 22 18 22s-1.652.449-1.903 1.062c-.632.176-1.097.75-1.097 1.438 0 .828.671 1.5 1.5 1.5.655 0 1.206-.422 1.41-1.007.03.001.059.007.09.007s.06-.006.09-.007c.205.585.756 1.007 1.41 1.007.828 0 1.5-.672 1.5-1.5 0-.688-.466-1.261-1.097-1.438z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..7c7ff7949
--- /dev/null
+++ b/public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#292F33" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#F7DECE" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..e601eae22
--- /dev/null
+++ b/public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#F7DECE" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#EEC2AD" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#F7DECE" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fb_border.svg b/public/emoji/1f482-1f3fb_border.svg
new file mode 100644
index 000000000..98d025086
--- /dev/null
+++ b/public/emoji/1f482-1f3fb_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#F7DECE" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#EEC2AD" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#292F33" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#F7DECE" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..4542fbc40
--- /dev/null
+++ b/public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#FFE51E" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#F3D2A2" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..e4cf68375
--- /dev/null
+++ b/public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#F3D2A2" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#E2C196" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#F3D2A2" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fc_border.svg b/public/emoji/1f482-1f3fc_border.svg
new file mode 100644
index 000000000..279f34362
--- /dev/null
+++ b/public/emoji/1f482-1f3fc_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#F3D2A2" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#E2C196" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#FFE51E" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#F3D2A2" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..d93566dcc
--- /dev/null
+++ b/public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#963B22" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#D5AB88" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..bd4270dd3
--- /dev/null
+++ b/public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#D5AB88" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#CC9B7A" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#D5AB88" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fd_border.svg b/public/emoji/1f482-1f3fd_border.svg
new file mode 100644
index 000000000..1d40871a6
--- /dev/null
+++ b/public/emoji/1f482-1f3fd_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#D4AB88" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#CC9B7A" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#963B22" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#D4AB88" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..1f590fa5e
--- /dev/null
+++ b/public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#60352A" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#AF7E57" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#60352A" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#915A34" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..b74e4930c
--- /dev/null
+++ b/public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#AF7E57" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#9B6A49" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#AF7E57" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#915A34" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#60352A" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fe_border.svg b/public/emoji/1f482-1f3fe_border.svg
new file mode 100644
index 000000000..0024c77f8
--- /dev/null
+++ b/public/emoji/1f482-1f3fe_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#AF7E57" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#9B6A49" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#60352A" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#AF7E57" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#915A34" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#915A34" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..e426d8efa
--- /dev/null
+++ b/public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#0B0200" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#7C533E" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#3D2E24" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..3c4515c0f
--- /dev/null
+++ b/public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#7C533E" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#664131" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#7C533E" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#3D2E24" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3ff_border.svg b/public/emoji/1f482-1f3ff_border.svg
new file mode 100644
index 000000000..0183693a9
--- /dev/null
+++ b/public/emoji/1f482-1f3ff_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#7C533E" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#664131" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#0B0200" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#7C533E" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#3D2E24" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#3D2E24" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-200d-2640-fe0f_border.svg b/public/emoji/1f482-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..480318a6e
--- /dev/null
+++ b/public/emoji/1f482-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#FFAC33" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#FFDC5D" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-200d-2642-fe0f_border.svg b/public/emoji/1f482-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..5c68070a7
--- /dev/null
+++ b/public/emoji/1f482-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#FFDC5D" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#F9CA55" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#FFDC5D" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482_border.svg b/public/emoji/1f482_border.svg
new file mode 100644
index 000000000..f4da528fb
--- /dev/null
+++ b/public/emoji/1f482_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#FFDC5D" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#F9CA55" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#FFAC33" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#FFDC5D" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f4a3_border.svg b/public/emoji/1f4a3_border.svg
new file mode 100644
index 000000000..aac8f4443
--- /dev/null
+++ b/public/emoji/1f4a3_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M24.187 9.657l5.658-5.654L32 6.16l-5.658 5.655z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="14" cy="22" r="14" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19 11.342l5.658-5.657 5.657 5.658L24.657 17z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32" cy="4" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32" cy="4" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M24.187 9.657l5.658-5.654L32 6.16l-5.658 5.655z"/>
+  <circle fill="#31373D" cx="14" cy="22" r="14"/>
+  <path fill="#31373D" d="M19 11.342l5.658-5.657 5.657 5.658L24.657 17z"/>
+  <circle fill="#F18F26" cx="32" cy="4" r="4"/>
+  <circle fill="#FDCB58" cx="32" cy="4" r="2"/>
+</svg>
diff --git a/public/emoji/1f4a8_border.svg b/public/emoji/1f4a8_border.svg
new file mode 100644
index 000000000..c20a5cb3b
--- /dev/null
+++ b/public/emoji/1f4a8_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 15c0-4.155-3.169-7.568-7.221-7.96C27.884 3.013 24.297 0 20 0c-4.971 0-9 3.56-9 8.531 0 1.156.25 2.906 1.121 3.785C8.859 12.5 4.094 12.6 0 12.015c0 0 4.816 3.831 15.357 3.985-.151.313-.254 1.43-.306 1.786-.249.003-.595.009-1.051.009C6 17.795 0 17 0 17s3 3.234 15.406 4.106C15 21.234 15 23 15 23c-8 0-15-1-15-1 3.362 2.802 6.724 4.033 9.03 4.574-.011.142-.03.281-.03.426 0 3.313 2.686 5 6 5 .487 0 .958-.064 1.412-.174C18.009 34.333 20.807 36 24 36c4.971 0 9-4.029 9-9 0-1.788-.527-3.449-1.427-4.851C34.195 20.837 36 18.132 36 15z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#BDDDF4" d="M36 15c0-4.155-3.169-7.568-7.221-7.96C27.884 3.013 24.297 0 20 0c-4.971 0-9 3.56-9 8.531 0 1.156.25 2.906 1.121 3.785C8.859 12.5 4.094 12.6 0 12.015c0 0 4.816 3.831 15.357 3.985-.151.313-.254 1.43-.306 1.786-.249.003-.595.009-1.051.009C6 17.795 0 17 0 17s3 3.234 15.406 4.106C15 21.234 15 23 15 23c-8 0-15-1-15-1 3.362 2.802 6.724 4.033 9.03 4.574-.011.142-.03.281-.03.426 0 3.313 2.686 5 6 5 .487 0 .958-.064 1.412-.174C18.009 34.333 20.807 36 24 36c4.971 0 9-4.029 9-9 0-1.788-.527-3.449-1.427-4.851C34.195 20.837 36 18.132 36 15z"/>
+</svg>
diff --git a/public/emoji/1f4ac_border.svg b/public/emoji/1f4ac_border.svg
new file mode 100644
index 000000000..3d71232f9
--- /dev/null
+++ b/public/emoji/1f4ac_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 1C8.059 1 0 7.268 0 15c0 4.368 2.574 8.268 6.604 10.835C6.08 28.144 4.859 31.569 2 35c5.758-.96 9.439-3.761 11.716-6.416 1.376.262 2.805.416 4.284.416 9.941 0 18-6.268 18-14S27.941 1 18 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="15" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="26" cy="15" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="10" cy="15" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#BDDDF4" d="M18 1C8.059 1 0 7.268 0 15c0 4.368 2.574 8.268 6.604 10.835C6.08 28.144 4.859 31.569 2 35c5.758-.96 9.439-3.761 11.716-6.416 1.376.262 2.805.416 4.284.416 9.941 0 18-6.268 18-14S27.941 1 18 1z"/>
+  <circle fill="#2A6797" cx="18" cy="15" r="2"/>
+  <circle fill="#2A6797" cx="26" cy="15" r="2"/>
+  <circle fill="#2A6797" cx="10" cy="15" r="2"/>
+</svg>
diff --git a/public/emoji/1f4ad_border.svg b/public/emoji/1f4ad_border.svg
new file mode 100644
index 000000000..c887a7126
--- /dev/null
+++ b/public/emoji/1f4ad_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35 12c0-3.866-3.134-7-7-7-1.167 0-2.265.29-3.232.794-2.082-2.827-5.425-4.669-9.205-4.669-5.132 0-9.475 3.38-10.923 8.036C1.982 9.778 0 12.155 0 15c0 2.979 2.174 5.445 5.021 5.913C5.237 24.862 8.498 28 12.5 28c2.176 0 4.13-.933 5.5-2.413C19.37 27.067 21.323 28 23.5 28c4.143 0 7.5-3.357 7.5-7.5 0-.71-.105-1.394-.289-2.045C33.23 17.396 35 14.905 35 12z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="4" cy="31" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#BDDDF4" d="M35 12c0-3.866-3.134-7-7-7-1.167 0-2.265.29-3.232.794-2.082-2.827-5.425-4.669-9.205-4.669-5.132 0-9.475 3.38-10.923 8.036C1.982 9.778 0 12.155 0 15c0 2.979 2.174 5.445 5.021 5.913C5.237 24.862 8.498 28 12.5 28c2.176 0 4.13-.933 5.5-2.413C19.37 27.067 21.323 28 23.5 28c4.143 0 7.5-3.357 7.5-7.5 0-.71-.105-1.394-.289-2.045C33.23 17.396 35 14.905 35 12z"/>
+  <circle fill="#BDDDF4" cx="4" cy="31" r="3"/>
+</svg>
diff --git a/public/emoji/1f4b1_border.svg b/public/emoji/1f4b1_border.svg
new file mode 100644
index 000000000..f5ef5e849
--- /dev/null
+++ b/public/emoji/1f4b1_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M15.068 14.278c0-4.719-8.7-4.411-8.7-7.261 0-1.379 1.32-2.053 2.85-2.053 2.574 0 3.032 1.654 4.198 1.654.824 0 1.223-.521 1.223-1.103 0-1.353-2.053-2.378-4.021-2.732V1.476C10.617.661 9.958 0 9.143 0c-.817 0-1.477.661-1.477 1.476v1.353c-2.147.489-3.992 1.978-3.992 4.404 0 4.532 8.698 4.349 8.698 7.532 0 1.103-1.193 2.207-3.155 2.207-2.941 0-3.921-1.992-5.115-1.992-.582 0-1.103.49-1.103 1.23 0 1.17 1.965 2.581 4.667 2.976l-.001.01v1.473c0 .818.661 1.479 1.477 1.479.815 0 1.476-.661 1.476-1.479v-1.473c0-.018-.008-.031-.009-.047 2.431-.453 4.459-2.039 4.459-4.871zm8.828 11.598h-4.104c-.688 0-1.227-.327-1.227-.985 0-.661.539-.99 1.227-.99h2.876l-4.792-7.399c-.298-.449-.449-.775-.449-1.195 0-.571.57-.99 1.049-.99.481 0 .958.21 1.378.839l5.36 8.058 5.362-8.058c.419-.629.897-.839 1.378-.839.477 0 1.046.419 1.046.99 0 .42-.148.746-.448 1.195L27.76 23.9h2.875c.689 0 1.229.329 1.229.99 0 .658-.539.985-1.229.985h-4.102v2.126h4.102c.689 0 1.229.332 1.229.99 0 .658-.539.987-1.229.987h-4.102v4.611c0 .868-.539 1.41-1.319 1.41-.778 0-1.317-.542-1.317-1.41v-4.611h-4.104c-.688 0-1.227-.329-1.227-.987 0-.658.539-.99 1.227-.99h4.104v-2.125z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.875 6.125L17 2l4.125 6.875L17 13h11V2zm-14.75 23.75L16 34l-4.125-6.875L16 23H5v11z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M15.068 14.278c0-4.719-8.7-4.411-8.7-7.261 0-1.379 1.32-2.053 2.85-2.053 2.574 0 3.032 1.654 4.198 1.654.824 0 1.223-.521 1.223-1.103 0-1.353-2.053-2.378-4.021-2.732V1.476C10.617.661 9.958 0 9.143 0c-.817 0-1.477.661-1.477 1.476v1.353c-2.147.489-3.992 1.978-3.992 4.404 0 4.532 8.698 4.349 8.698 7.532 0 1.103-1.193 2.207-3.155 2.207-2.941 0-3.921-1.992-5.115-1.992-.582 0-1.103.49-1.103 1.23 0 1.17 1.965 2.581 4.667 2.976l-.001.01v1.473c0 .818.661 1.479 1.477 1.479.815 0 1.476-.661 1.476-1.479v-1.473c0-.018-.008-.031-.009-.047 2.431-.453 4.459-2.039 4.459-4.871zm8.828 11.598h-4.104c-.688 0-1.227-.327-1.227-.985 0-.661.539-.99 1.227-.99h2.876l-4.792-7.399c-.298-.449-.449-.775-.449-1.195 0-.571.57-.99 1.049-.99.481 0 .958.21 1.378.839l5.36 8.058 5.362-8.058c.419-.629.897-.839 1.378-.839.477 0 1.046.419 1.046.99 0 .42-.148.746-.448 1.195L27.76 23.9h2.875c.689 0 1.229.329 1.229.99 0 .658-.539.985-1.229.985h-4.102v2.126h4.102c.689 0 1.229.332 1.229.99 0 .658-.539.987-1.229.987h-4.102v4.611c0 .868-.539 1.41-1.319 1.41-.778 0-1.317-.542-1.317-1.41v-4.611h-4.104c-.688 0-1.227-.329-1.227-.987 0-.658.539-.99 1.227-.99h4.104v-2.125z"/>
+  <path fill="#67757F" d="M23.875 6.125L17 2l4.125 6.875L17 13h11V2zm-14.75 23.75L16 34l-4.125-6.875L16 23H5v11z"/>
+</svg>
diff --git a/public/emoji/1f4b2_border.svg b/public/emoji/1f4b2_border.svg
new file mode 100644
index 000000000..3bfe777e4
--- /dev/null
+++ b/public/emoji/1f4b2_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28.81 23.209c0-7.672-14.144-7.171-14.144-11.803 0-2.242 2.145-3.337 4.633-3.337 4.184 0 4.929 2.688 6.824 2.688 1.342 0 1.988-.845 1.988-1.792 0-2.201-3.337-3.867-6.537-4.444V2.397c0-1.325-1.072-2.4-2.398-2.4-1.327 0-2.4 1.075-2.4 2.4v2.199c-3.489.794-6.49 3.214-6.49 7.159 0 7.369 14.142 7.071 14.142 12.247 0 1.793-1.941 3.586-5.129 3.586-4.781 0-6.374-3.236-8.316-3.236-.946 0-1.792.796-1.792 1.996 0 1.906 3.195 4.2 7.588 4.841l-.003.015v2.397c0 1.326 1.075 2.401 2.401 2.401 1.325 0 2.399-1.075 2.399-2.401v-2.397c0-.028-.014-.05-.016-.075 3.953-.738 7.25-3.315 7.25-7.92z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M28.81 23.209c0-7.672-14.144-7.171-14.144-11.803 0-2.242 2.145-3.337 4.633-3.337 4.184 0 4.929 2.688 6.824 2.688 1.342 0 1.988-.845 1.988-1.792 0-2.201-3.337-3.867-6.537-4.444V2.397c0-1.325-1.072-2.4-2.398-2.4-1.327 0-2.4 1.075-2.4 2.4v2.199c-3.489.794-6.49 3.214-6.49 7.159 0 7.369 14.142 7.071 14.142 12.247 0 1.793-1.941 3.586-5.129 3.586-4.781 0-6.374-3.236-8.316-3.236-.946 0-1.792.796-1.792 1.996 0 1.906 3.195 4.2 7.588 4.841l-.003.015v2.397c0 1.326 1.075 2.401 2.401 2.401 1.325 0 2.399-1.075 2.399-2.401v-2.397c0-.028-.014-.05-.016-.075 3.953-.738 7.25-3.315 7.25-7.92z"/>
+</svg>
diff --git a/public/emoji/1f4c3_border.svg b/public/emoji/1f4c3_border.svg
new file mode 100644
index 000000000..9e7b56241
--- /dev/null
+++ b/public/emoji/1f4c3_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.875-4-8V4c0-2.209 1.791-4 4-4h20c2.209 0 4 1.791 4 4v28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31 36H4c4 0 4-8 4-8 0-2.209 1.791-4 4-4h20c2.209 0 4 2 4 4 0 0 .25 8-5 8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24 7c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .553-.447 1-1 1H5c-.552 0-1-.447-1-1 0-.553.448-1 1-1h18c.553 0 1 .447 1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M28 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.875-4-8V4c0-2.209 1.791-4 4-4h20c2.209 0 4 1.791 4 4v28z"/>
+  <path fill="#E1E8ED" d="M31 36H4c4 0 4-8 4-8 0-2.209 1.791-4 4-4h20c2.209 0 4 2 4 4 0 0 .25 8-5 8z"/>
+  <path fill="#99AAB5" d="M24 7c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .553-.447 1-1 1H5c-.552 0-1-.447-1-1 0-.553.448-1 1-1h18c.553 0 1 .447 1 1z"/>
+</svg>
diff --git a/public/emoji/1f4de_border.svg b/public/emoji/1f4de_border.svg
new file mode 100644
index 000000000..2a8044d96
--- /dev/null
+++ b/public/emoji/1f4de_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34.06 26.407l-3.496-3.496c-1.93-1.93-5.06-1.93-6.989 0-.719.718-1.167 1.603-1.351 2.528-5.765-1.078-11.372-6.662-11.721-11.653.947-.176 1.854-.627 2.586-1.36 1.93-1.93 1.93-5.06 0-6.99L9.594 1.94c-1.93-1.93-5.06-1.93-6.99 0-10.486 10.486 20.97 41.942 31.456 31.456 1.929-1.929 1.929-5.059 0-6.989z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34.06 26.407l-3.496-3.496c-1.93-1.93-5.06-1.93-6.989 0-.719.718-1.167 1.603-1.351 2.528-5.765-1.078-11.372-6.662-11.721-11.653.947-.176 1.854-.627 2.586-1.36 1.93-1.93 1.93-5.06 0-6.99L9.594 1.94c-1.93-1.93-5.06-1.93-6.99 0-10.486 10.486 20.97 41.942 31.456 31.456 1.929-1.929 1.929-5.059 0-6.989z"/>
+</svg>
diff --git a/public/emoji/1f4f7_border.svg b/public/emoji/1f4f7_border.svg
new file mode 100644
index 000000000..60421f912
--- /dev/null
+++ b/public/emoji/1f4f7_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M4 5s0-1 1-1h6s1 0 1 1v2H4V5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="10" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="8" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32.5" cy="9.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12 9.5c0 .829-.671 1.5-1.5 1.5h-5C4.671 11 4 10.329 4 9.5S4.671 8 5.5 8h5c.829 0 1.5.671 1.5 1.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#66757F" d="M4 5s0-1 1-1h6s1 0 1 1v2H4V5z"/>
+  <path fill="#31373D" d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z"/>
+  <circle fill="#CCD6DD" cx="21" cy="19" r="10"/>
+  <circle fill="#31373D" cx="21" cy="19" r="8"/>
+  <circle fill="#3B88C3" cx="21" cy="19" r="5"/>
+  <circle fill="#FFF" cx="32.5" cy="9.5" r="1.5"/>
+  <path fill="#F5F8FA" d="M12 9.5c0 .829-.671 1.5-1.5 1.5h-5C4.671 11 4 10.329 4 9.5S4.671 8 5.5 8h5c.829 0 1.5.671 1.5 1.5z"/>
+</svg>
diff --git a/public/emoji/1f4f8_border.svg b/public/emoji/1f4f8_border.svg
new file mode 100644
index 000000000..6bb518f54
--- /dev/null
+++ b/public/emoji/1f4f8_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="10" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="8" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32.5" cy="9.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 9l3-6-6 2-4-5-2 5-6-1 4 6-5 4h6l-2 6 6-3 6 5-1-8 6-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 14l-3 2 1-3-3-1 3-2-3-3h4l1-3 2 3 3-1-2 3 3 3-3 1 1 4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z"/>
+  <circle fill="#CCD6DD" cx="21" cy="19" r="10"/>
+  <circle fill="#31373D" cx="21" cy="19" r="8"/>
+  <circle fill="#3B88C3" cx="21" cy="19" r="5"/>
+  <circle fill="#FFF" cx="32.5" cy="9.5" r="1.5"/>
+  <path fill="#FFAC33" d="M16 9l3-6-6 2-4-5-2 5-6-1 4 6-5 4h6l-2 6 6-3 6 5-1-8 6-1z"/>
+  <path fill="#FFF" d="M10 14l-3 2 1-3-3-1 3-2-3-3h4l1-3 2 3 3-1-2 3 3 3-3 1 1 4z"/>
+</svg>
diff --git a/public/emoji/1f4f9_border.svg b/public/emoji/1f4f9_border.svg
new file mode 100644
index 000000000..8adae2f15
--- /dev/null
+++ b/public/emoji/1f4f9_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29 18H16c-3.668 0-5-2.99-5-5v-2H7c-3 0-3 3-3 3s-2-1-3-1-1 1-1 1v10s0 1 1 1 3-1 3-1v7c0 4 4 4 4 4h18c4 0 4-4 4-4V17.894c-.347.069-.685.106-1 .106z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35 6c-.559 0-2.05.934-3.26 1.76C31.413 6.934 30.674 6 29 6H18s-5 0-5 5v2s0 3 3 3h13s2.075-.006 2.771-1.739C32.976 15.082 34.446 16 35 16c1 0 1-1 1-1V7s0-1-1-1zM9 35v-9s0-3 2.75-3H22s3 0 3 3v9h-2v-9s0-1-1-1H12s-1 0-1 1v9H9z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M29 18H16c-3.668 0-5-2.99-5-5v-2H7c-3 0-3 3-3 3s-2-1-3-1-1 1-1 1v10s0 1 1 1 3-1 3-1v7c0 4 4 4 4 4h18c4 0 4-4 4-4V17.894c-.347.069-.685.106-1 .106z"/>
+  <path fill="#66757F" d="M35 6c-.559 0-2.05.934-3.26 1.76C31.413 6.934 30.674 6 29 6H18s-5 0-5 5v2s0 3 3 3h13s2.075-.006 2.771-1.739C32.976 15.082 34.446 16 35 16c1 0 1-1 1-1V7s0-1-1-1zM9 35v-9s0-3 2.75-3H22s3 0 3 3v9h-2v-9s0-1-1-1H12s-1 0-1 1v9H9z"/>
+</svg>
diff --git a/public/emoji/1f4fc_border.svg b/public/emoji/1f4fc_border.svg
new file mode 100644
index 000000000..8b6081428
--- /dev/null
+++ b/public/emoji/1f4fc_border.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 25s0 4-4 4H4s-4 0-4-4V10c0-4 4-4 4-4h28s4 0 4 4v15z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32 12h-6s-1 0-1 1v8s0 1 1 1h6c1 0 2-2 2-5s-1-5-2-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M29.894 12H26s-1 0-1 1v1c1.656 0 3 1.343 3 3s-1.344 3-3 3v1s0 1 1 1h3.895C31.193 20.73 32 18.96 32 17c0-1.959-.808-3.729-2.106-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 17c0-1.657-1.344-3-3-3v6c1.656 0 3-1.343 3-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4 12h6s1 0 1 1v8s0 1-1 1H4c-1 0-2-2-2-5s1-5 2-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11 20c-1.657 0-3-1.343-3-3s1.343-3 3-3v-1c0-1-1-1-1-1H6.106C4.808 13.271 4 15.04 4 17s.808 3.729 2.106 5H10c1 0 1-1 1-1v-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 17c0 1.657 1.343 3 3 3v-6c-1.657 0-3 1.343-3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13 14s0-1 1-1h8s1 0 1 1v6s0 1-1 1h-8s-1 0-1-1v-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34 26c0 .553-.447 1-1 1H3c-.552 0-1-.447-1-1 0-.553.448-1 1-1h30c.553 0 1 .447 1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M36 25s0 4-4 4H4s-4 0-4-4V10c0-4 4-4 4-4h28s4 0 4 4v15z"/>
+  <path fill="#CCD6DD" d="M32 12h-6s-1 0-1 1v8s0 1 1 1h6c1 0 2-2 2-5s-1-5-2-5z"/>
+  <path d="M29.894 12H26s-1 0-1 1v1c1.656 0 3 1.343 3 3s-1.344 3-3 3v1s0 1 1 1h3.895C31.193 20.73 32 18.96 32 17c0-1.959-.808-3.729-2.106-5z"/>
+  <path fill="#66757F" d="M28 17c0-1.657-1.344-3-3-3v6c1.656 0 3-1.343 3-3z"/>
+  <path fill="#CCD6DD" d="M4 12h6s1 0 1 1v8s0 1-1 1H4c-1 0-2-2-2-5s1-5 2-5z"/>
+  <path d="M11 20c-1.657 0-3-1.343-3-3s1.343-3 3-3v-1c0-1-1-1-1-1H6.106C4.808 13.271 4 15.04 4 17s.808 3.729 2.106 5H10c1 0 1-1 1-1v-1z"/>
+  <path fill="#66757F" d="M8 17c0 1.657 1.343 3 3 3v-6c-1.657 0-3 1.343-3 3z"/>
+  <path fill="#88C9F9" d="M13 14s0-1 1-1h8s1 0 1 1v6s0 1-1 1h-8s-1 0-1-1v-6z"/>
+  <path d="M34 26c0 .553-.447 1-1 1H3c-.552 0-1-.447-1-1 0-.553.448-1 1-1h30c.553 0 1 .447 1 1z"/>
+</svg>
diff --git a/public/emoji/1f4fd_border.svg b/public/emoji/1f4fd_border.svg
new file mode 100644
index 000000000..3b2050bae
--- /dev/null
+++ b/public/emoji/1f4fd_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M34.074 18l-4.832 3H28v-4c0-.088-.02-.169-.026-.256C31.436 15.864 34 12.735 34 9c0-4.418-3.582-8-8-8s-8.001 3.582-8.001 8c0 1.463.412 2.822 1.099 4H14.92c.047-.328.08-.66.08-1 0-3.866-3.134-7-7-7-3.865 0-7 3.134-7 7 0 2.79 1.638 5.193 4 6.317V29c0 2.209 1.791 4 4 4h15c2.209 0 4-1.791 4-4v-3h1.242l4.832 3H35V18h-.926zM28.727 3.977c1.762.959 2.961 2.819 2.984 4.961L28.18 8.35c-.112-.376-.31-.715-.583-.982l1.13-3.391zm-.9 6.342l3.552.592c-.66 1.857-2.254 3.26-4.214 3.669-.37-.483-.843-.875-1.392-1.148l.625-2.19c.556-.113 1.076-.452 1.429-.923zM26 3.285c.282 0 .557.027.828.067l-1.131 3.392c-.404.054-.772.21-1.081.446L21.42 5.592c1.042-1.397 2.703-2.307 4.58-2.307zM20.285 9c0-.563.085-1.106.236-1.62l3.194 1.597-.002.023c0 .657.313 1.245.771 1.662L23.816 13h-1.871c-1.02-1.03-1.66-2.436-1.66-4zm-9.088-.385c.901.851 1.47 2.048 1.47 3.385 0 .344-.043.677-.113 1H10.1c.145-.304.233-.641.233-1 0-.478-.145-.922-.392-1.292l1.256-2.093zM8 7.333c.519 0 1.01.105 1.476.261L8.22 9.688c-.073-.007-.145-.022-.22-.022-.478 0-.922.145-1.292.392L4.615 8.803c.851-.901 2.048-1.47 3.385-1.47zM3.333 12c0-.519.105-1.01.261-1.477l2.095 1.257c-.007.073-.022.144-.022.22 0 .75.36 1.41.91 1.837-.624.479-1.097 1.134-1.353 1.895-1.141-.851-1.891-2.199-1.891-3.732z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="24" cy="19" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="9" cy="19" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24 27c0-1.104-.896-2-2-2H11c-1.104 0-2 .896-2 2v6c0 1.104.896 2 2 2h11c1.104 0 2-.896 2-2v-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34.074 18l-4.832 3H28v-4c0-.088-.02-.169-.026-.256C31.436 15.864 34 12.735 34 9c0-4.418-3.582-8-8-8s-8.001 3.582-8.001 8c0 1.463.412 2.822 1.099 4H14.92c.047-.328.08-.66.08-1 0-3.866-3.134-7-7-7-3.865 0-7 3.134-7 7 0 2.79 1.638 5.193 4 6.317V29c0 2.209 1.791 4 4 4h15c2.209 0 4-1.791 4-4v-3h1.242l4.832 3H35V18h-.926zM28.727 3.977c1.762.959 2.961 2.819 2.984 4.961L28.18 8.35c-.112-.376-.31-.715-.583-.982l1.13-3.391zm-.9 6.342l3.552.592c-.66 1.857-2.254 3.26-4.214 3.669-.37-.483-.843-.875-1.392-1.148l.625-2.19c.556-.113 1.076-.452 1.429-.923zM26 3.285c.282 0 .557.027.828.067l-1.131 3.392c-.404.054-.772.21-1.081.446L21.42 5.592c1.042-1.397 2.703-2.307 4.58-2.307zM20.285 9c0-.563.085-1.106.236-1.62l3.194 1.597-.002.023c0 .657.313 1.245.771 1.662L23.816 13h-1.871c-1.02-1.03-1.66-2.436-1.66-4zm-9.088-.385c.901.851 1.47 2.048 1.47 3.385 0 .344-.043.677-.113 1H10.1c.145-.304.233-.641.233-1 0-.478-.145-.922-.392-1.292l1.256-2.093zM8 7.333c.519 0 1.01.105 1.476.261L8.22 9.688c-.073-.007-.145-.022-.22-.022-.478 0-.922.145-1.292.392L4.615 8.803c.851-.901 2.048-1.47 3.385-1.47zM3.333 12c0-.519.105-1.01.261-1.477l2.095 1.257c-.007.073-.022.144-.022.22 0 .75.36 1.41.91 1.837-.624.479-1.097 1.134-1.353 1.895-1.141-.851-1.891-2.199-1.891-3.732z"/>
+  <circle fill="#8899A6" cx="24" cy="19" r="2"/>
+  <circle fill="#8899A6" cx="9" cy="19" r="2"/>
+  <path fill="#8899A6" d="M24 27c0-1.104-.896-2-2-2H11c-1.104 0-2 .896-2 2v6c0 1.104.896 2 2 2h11c1.104 0 2-.896 2-2v-6z"/>
+</svg>
diff --git a/public/emoji/1f507_border.svg b/public/emoji/1f507_border.svg
new file mode 100644
index 000000000..cd02481bd
--- /dev/null
+++ b/public/emoji/1f507_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31.003 33.003L3.997 5.997c-.551-.551-.551-1.443 0-1.994l.006-.006c.551-.551 1.443-.551 1.994 0l27.006 27.006c.551.551.551 1.443 0 1.994l-.006.006c-.551.551-1.443.551-1.994 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z"/>
+  <path fill="#CCD6DD" d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+  <path fill="#DD2E44" d="M31.003 33.003L3.997 5.997c-.551-.551-.551-1.443 0-1.994l.006-.006c.551-.551 1.443-.551 1.994 0l27.006 27.006c.551.551.551 1.443 0 1.994l-.006.006c-.551.551-1.443.551-1.994 0z"/>
+</svg>
diff --git a/public/emoji/1f508_border.svg b/public/emoji/1f508_border.svg
new file mode 100644
index 000000000..c920d89dc
--- /dev/null
+++ b/public/emoji/1f508_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z"/>
+  <path fill="#CCD6DD" d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+</svg>
diff --git a/public/emoji/1f509_border.svg b/public/emoji/1f509_border.svg
new file mode 100644
index 000000000..6881edb30
--- /dev/null
+++ b/public/emoji/1f509_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M7 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C29.934 22.658 31 20.403 31 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C31.639 12.116 33 14.957 33 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M7 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H7z"/>
+  <path fill="#CCD6DD" d="M13 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+  <path fill="#8899A6" d="M28.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C29.934 22.658 31 20.403 31 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C31.639 12.116 33 14.957 33 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z"/>
+</svg>
diff --git a/public/emoji/1f50a_border.svg b/public/emoji/1f50a_border.svg
new file mode 100644
index 000000000..549811b69
--- /dev/null
+++ b/public/emoji/1f50a_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M2 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M29 32.019c-.267 0-.533-.113-.72-.332-.339-.398-.292-.995.105-1.334 3.603-3.071 5.668-7.551 5.668-12.29s-2.066-9.219-5.669-12.29c-.397-.339-.444-.937-.105-1.334.339-.399.935-.444 1.334-.106 4.024 3.431 6.333 8.436 6.333 13.73 0 5.294-2.309 10.299-6.332 13.729-.179.152-.396.227-.614.227z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M26.27 28.959c-.269 0-.533-.115-.717-.338-.327-.396-.271-.98.125-1.307 2.792-2.304 4.394-5.699 4.394-9.315 0-3.573-1.571-6.943-4.311-9.245-.392-.33-.443-.916-.113-1.308.33-.394.915-.443 1.309-.114 3.16 2.656 4.973 6.543 4.973 10.667 0 4.172-1.848 8.089-5.069 10.746-.174.145-.383.214-.591.214z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C24.934 22.658 26 20.403 26 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C26.639 12.116 28 14.957 28 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M2 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H2z"/>
+  <path fill="#CCD6DD" d="M8 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+  <path fill="#8899A6" d="M29 32.019c-.267 0-.533-.113-.72-.332-.339-.398-.292-.995.105-1.334 3.603-3.071 5.668-7.551 5.668-12.29s-2.066-9.219-5.669-12.29c-.397-.339-.444-.937-.105-1.334.339-.399.935-.444 1.334-.106 4.024 3.431 6.333 8.436 6.333 13.73 0 5.294-2.309 10.299-6.332 13.729-.179.152-.396.227-.614.227z"/>
+  <path fill="#8899A6" d="M26.27 28.959c-.269 0-.533-.115-.717-.338-.327-.396-.271-.98.125-1.307 2.792-2.304 4.394-5.699 4.394-9.315 0-3.573-1.571-6.943-4.311-9.245-.392-.33-.443-.916-.113-1.308.33-.394.915-.443 1.309-.114 3.16 2.656 4.973 6.543 4.973 10.667 0 4.172-1.848 8.089-5.069 10.746-.174.145-.383.214-.591.214z"/>
+  <path fill="#8899A6" d="M23.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C24.934 22.658 26 20.403 26 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C26.639 12.116 28 14.957 28 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z"/>
+</svg>
diff --git a/public/emoji/1f50c_border.svg b/public/emoji/1f50c_border.svg
new file mode 100644
index 000000000..6e37ecd63
--- /dev/null
+++ b/public/emoji/1f50c_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M11.858 16.264c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L1.959 9.192c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.485 8.486zm7.072-7.071c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L9.029 2.121c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.487 8.486z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34 36c0-4.966-2.56-8.581-4.562-10.65.898-1.532.704-3.529-.61-4.844l-1.099-1.099c.352-1.332.021-2.806-1.022-3.851l-4.949-4.95c.78-.781.78-2.047 0-2.828-.781-.781-2.049-.781-2.829-.001l-2.826 2.826-.003.002-4.242 4.243-2.828 2.828c-.781.781-.781 2.047 0 2.828.781.781 2.047.781 2.828 0l4.95 4.95c1.044 1.044 2.519 1.373 3.85 1.021l1.101 1.101c1.318 1.318 3.323 1.51 4.857.602C28.099 29.726 30 32.404 30 36h4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#9AAAB4" d="M11.858 16.264c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L1.959 9.192c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.485 8.486zm7.072-7.071c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L9.029 2.121c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.487 8.486z"/>
+  <path fill="#31373D" d="M34 36c0-4.966-2.56-8.581-4.562-10.65.898-1.532.704-3.529-.61-4.844l-1.099-1.099c.352-1.332.021-2.806-1.022-3.851l-4.949-4.95c.78-.781.78-2.047 0-2.828-.781-.781-2.049-.781-2.829-.001l-2.826 2.826-.003.002-4.242 4.243-2.828 2.828c-.781.781-.781 2.047 0 2.828.781.781 2.047.781 2.828 0l4.95 4.95c1.044 1.044 2.519 1.373 3.85 1.021l1.101 1.101c1.318 1.318 3.323 1.51 4.857.602C28.099 29.726 30 32.404 30 36h4z"/>
+</svg>
diff --git a/public/emoji/1f519_border.svg b/public/emoji/1f519_border.svg
new file mode 100644
index 000000000..801bafb8b
--- /dev/null
+++ b/public/emoji/1f519_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 3H12.475V1.128c0-1.046-.74-1.435-1.645-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.024 26.184c0-.727.5-1.137 1.197-1.137H4.13c1.576 0 2.849 1.061 2.849 2.667 0 1.061-.439 1.772-1.409 2.227v.03c1.288.183 2.303 1.258 2.303 2.576 0 2.137-1.424 3.288-3.516 3.288h-3.12c-.697 0-1.212-.439-1.212-1.151v-8.5zm2.273 3.135h1.182c.742 0 1.227-.439 1.227-1.196 0-.713-.561-1.076-1.227-1.076H2.297v2.272zm0 4.516h1.788c.818 0 1.424-.47 1.424-1.318 0-.712-.545-1.197-1.606-1.197H2.297v2.515zm9.217-7.713c.258-.696.85-1.257 1.621-1.257.805 0 1.365.53 1.621 1.257l2.971 8.243c.092.242.121.454.121.561 0 .591-.484 1-1.045 1-.637 0-.955-.333-1.107-.788l-.453-1.424H11.03l-.455 1.409c-.15.47-.469.803-1.09.803-.607 0-1.122-.454-1.122-1.061 0-.242.076-.424.106-.5l3.045-8.243zm.168 5.501h2.879l-1.41-4.395h-.029l-1.44 4.395zm11.378-6.758c1.106 0 3.258.363 3.258 1.696 0 .546-.379 1.016-.94 1.016-.621 0-1.046-.53-2.318-.53-1.879 0-2.849 1.591-2.849 3.439 0 1.803.985 3.349 2.849 3.349 1.272 0 1.788-.637 2.409-.637.682 0 1 .682 1 1.03 0 1.455-2.288 1.788-3.409 1.788-3.076 0-5.212-2.439-5.212-5.576 0-3.151 2.121-5.575 5.212-5.575zm4.471 1.212c0-.621.455-1.121 1.137-1.121.651 0 1.137.424 1.137 1.121v3.273l3.727-3.97c.167-.182.455-.424.879-.424.576 0 1.121.439 1.121 1.091 0 .393-.242.712-.742 1.212l-2.863 2.818 3.5 3.651c.363.364.637.697.637 1.152 0 .712-.562 1.045-1.183 1.045-.44 0-.727-.258-1.151-.712l-3.924-4.243v3.864c0 .591-.455 1.091-1.137 1.091-.651 0-1.137-.424-1.137-1.091v-8.757z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 3H12.475V1.128c0-1.046-.74-1.435-1.645-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.024 26.184c0-.727.5-1.137 1.197-1.137H4.13c1.576 0 2.849 1.061 2.849 2.667 0 1.061-.439 1.772-1.409 2.227v.03c1.288.183 2.303 1.258 2.303 2.576 0 2.137-1.424 3.288-3.516 3.288h-3.12c-.697 0-1.212-.439-1.212-1.151v-8.5zm2.273 3.135h1.182c.742 0 1.227-.439 1.227-1.196 0-.713-.561-1.076-1.227-1.076H2.297v2.272zm0 4.516h1.788c.818 0 1.424-.47 1.424-1.318 0-.712-.545-1.197-1.606-1.197H2.297v2.515zm9.217-7.713c.258-.696.85-1.257 1.621-1.257.805 0 1.365.53 1.621 1.257l2.971 8.243c.092.242.121.454.121.561 0 .591-.484 1-1.045 1-.637 0-.955-.333-1.107-.788l-.453-1.424H11.03l-.455 1.409c-.15.47-.469.803-1.09.803-.607 0-1.122-.454-1.122-1.061 0-.242.076-.424.106-.5l3.045-8.243zm.168 5.501h2.879l-1.41-4.395h-.029l-1.44 4.395zm11.378-6.758c1.106 0 3.258.363 3.258 1.696 0 .546-.379 1.016-.94 1.016-.621 0-1.046-.53-2.318-.53-1.879 0-2.849 1.591-2.849 3.439 0 1.803.985 3.349 2.849 3.349 1.272 0 1.788-.637 2.409-.637.682 0 1 .682 1 1.03 0 1.455-2.288 1.788-3.409 1.788-3.076 0-5.212-2.439-5.212-5.576 0-3.151 2.121-5.575 5.212-5.575zm4.471 1.212c0-.621.455-1.121 1.137-1.121.651 0 1.137.424 1.137 1.121v3.273l3.727-3.97c.167-.182.455-.424.879-.424.576 0 1.121.439 1.121 1.091 0 .393-.242.712-.742 1.212l-2.863 2.818 3.5 3.651c.363.364.637.697.637 1.152 0 .712-.562 1.045-1.183 1.045-.44 0-.727-.258-1.151-.712l-3.924-4.243v3.864c0 .591-.455 1.091-1.137 1.091-.651 0-1.137-.424-1.137-1.091v-8.757z"/>
+</svg>
diff --git a/public/emoji/1f51a_border.svg b/public/emoji/1f51a_border.svg
new file mode 100644
index 000000000..057cf9820
--- /dev/null
+++ b/public/emoji/1f51a_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 3H12.475V1.128c0-1.046-.74-1.434-1.644-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.088 22.915c0-1.03.515-1.791 1.606-1.791h5.108c.989 0 1.462.7 1.462 1.421 0 .7-.495 1.421-1.462 1.421H3.178v3.008h3.378c1.009 0 1.503.699 1.503 1.421 0 .699-.515 1.42-1.503 1.42H3.178v3.131h3.811c.988 0 1.462.701 1.462 1.421 0 .701-.495 1.422-1.462 1.422H1.675c-.906 0-1.586-.617-1.586-1.544v-11.33zm9.419-.309c0-1.029.659-1.606 1.545-1.606.392 0 1.03.31 1.298.68l6.529 8.712h.041v-7.785c0-1.029.659-1.606 1.545-1.606.886 0 1.545.577 1.545 1.606v11.699c0 1.03-.659 1.606-1.545 1.606-.391 0-1.009-.309-1.297-.681l-6.53-8.608h-.041v7.683c0 1.03-.659 1.606-1.544 1.606s-1.545-.576-1.545-1.606v-11.7zm14.239.104c0-.948.659-1.586 1.586-1.586h3.419c4.612 0 7.249 2.965 7.249 7.537 0 4.326-2.801 7.127-7.043 7.127h-3.584c-.68 0-1.627-.37-1.627-1.544V22.71zm3.09 10.235h2.08c2.656 0 3.872-1.957 3.872-4.429 0-2.637-1.235-4.551-4.078-4.551h-1.874v8.98z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 3H12.475V1.128c0-1.046-.74-1.434-1.644-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.088 22.915c0-1.03.515-1.791 1.606-1.791h5.108c.989 0 1.462.7 1.462 1.421 0 .7-.495 1.421-1.462 1.421H3.178v3.008h3.378c1.009 0 1.503.699 1.503 1.421 0 .699-.515 1.42-1.503 1.42H3.178v3.131h3.811c.988 0 1.462.701 1.462 1.421 0 .701-.495 1.422-1.462 1.422H1.675c-.906 0-1.586-.617-1.586-1.544v-11.33zm9.419-.309c0-1.029.659-1.606 1.545-1.606.392 0 1.03.31 1.298.68l6.529 8.712h.041v-7.785c0-1.029.659-1.606 1.545-1.606.886 0 1.545.577 1.545 1.606v11.699c0 1.03-.659 1.606-1.545 1.606-.391 0-1.009-.309-1.297-.681l-6.53-8.608h-.041v7.683c0 1.03-.659 1.606-1.544 1.606s-1.545-.576-1.545-1.606v-11.7zm14.239.104c0-.948.659-1.586 1.586-1.586h3.419c4.612 0 7.249 2.965 7.249 7.537 0 4.326-2.801 7.127-7.043 7.127h-3.584c-.68 0-1.627-.37-1.627-1.544V22.71zm3.09 10.235h2.08c2.656 0 3.872-1.957 3.872-4.429 0-2.637-1.235-4.551-4.078-4.551h-1.874v8.98z"/>
+</svg>
diff --git a/public/emoji/1f51b_border.svg b/public/emoji/1f51b_border.svg
new file mode 100644
index 000000000..ccc8ed099
--- /dev/null
+++ b/public/emoji/1f51b_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3h-11.05V1.128c0-1.046-.74-1.434-1.644-.865L.689 6.652c-.904.57-.922 1.527-.037 2.127l10.215 6.932c.885.602 1.607.234 1.607-.812V13h11.051v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM.204 27.986c0-4.529 3.048-8.014 7.49-8.014 4.377 0 7.491 3.594 7.491 8.014 0 4.506-3.027 8.014-7.491 8.014-4.42 0-7.49-3.508-7.49-8.014zm11.584 0c0-2.635-1.372-5.01-4.094-5.01-2.721 0-4.094 2.375-4.094 5.01 0 2.656 1.33 5.008 4.094 5.008 2.765 0 4.094-2.351 4.094-5.008zm4.625-6.184c0-1.089.696-1.699 1.632-1.699.415 0 1.089.327 1.373.72l6.902 9.211h.045v-8.231c0-1.089.694-1.699 1.633-1.699.937 0 1.633.61 1.633 1.699V34.17c0 1.088-.696 1.697-1.633 1.697-.415 0-1.067-.326-1.372-.717l-6.903-9.102h-.044v8.121c0 1.088-.697 1.697-1.633 1.697s-1.632-.609-1.632-1.697V21.802zm16.013 12.499c0-.936.762-1.699 1.698-1.699.936 0 1.698.764 1.698 1.699 0 .936-.763 1.699-1.698 1.699-.936 0-1.698-.764-1.698-1.699zm.131-12.848c0-.914.673-1.48 1.567-1.48.87 0 1.567.588 1.567 1.48v8.384c0 .894-.697 1.479-1.567 1.479-.895 0-1.567-.564-1.567-1.479v-8.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3h-11.05V1.128c0-1.046-.74-1.434-1.644-.865L.689 6.652c-.904.57-.922 1.527-.037 2.127l10.215 6.932c.885.602 1.607.234 1.607-.812V13h11.051v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM.204 27.986c0-4.529 3.048-8.014 7.49-8.014 4.377 0 7.491 3.594 7.491 8.014 0 4.506-3.027 8.014-7.491 8.014-4.42 0-7.49-3.508-7.49-8.014zm11.584 0c0-2.635-1.372-5.01-4.094-5.01-2.721 0-4.094 2.375-4.094 5.01 0 2.656 1.33 5.008 4.094 5.008 2.765 0 4.094-2.351 4.094-5.008zm4.625-6.184c0-1.089.696-1.699 1.632-1.699.415 0 1.089.327 1.373.72l6.902 9.211h.045v-8.231c0-1.089.694-1.699 1.633-1.699.937 0 1.633.61 1.633 1.699V34.17c0 1.088-.696 1.697-1.633 1.697-.415 0-1.067-.326-1.372-.717l-6.903-9.102h-.044v8.121c0 1.088-.697 1.697-1.633 1.697s-1.632-.609-1.632-1.697V21.802zm16.013 12.499c0-.936.762-1.699 1.698-1.699.936 0 1.698.764 1.698 1.699 0 .936-.763 1.699-1.698 1.699-.936 0-1.698-.764-1.698-1.699zm.131-12.848c0-.914.673-1.48 1.567-1.48.87 0 1.567.588 1.567 1.48v8.384c0 .894-.697 1.479-1.567 1.479-.895 0-1.567-.564-1.567-1.479v-8.384z"/>
+</svg>
diff --git a/public/emoji/1f51c_border.svg b/public/emoji/1f51c_border.svg
new file mode 100644
index 000000000..3552cfa65
--- /dev/null
+++ b/public/emoji/1f51c_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3H2C.896 3 0 3.895 0 5v6c0 1.104.896 2 2 2h21.525v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM6.303 27.263c0 .537-.357 1.018-.921 1.018-.563 0-1.002-.412-1.826-.412-.591 0-1.126.316-1.126.893 0 1.414 4.587.509 4.587 4.052C7.017 34.776 5.396 36 3.501 36c-1.058 0-3.337-.248-3.337-1.539 0-.535.356-.976.92-.976.645 0 1.415.536 2.308.536.907 0 1.401-.509 1.401-1.182 0-1.62-4.588-.645-4.588-3.832 0-1.923 1.58-3.118 3.407-3.118.768.001 2.691.289 2.691 1.374zm1.213 3.681c0-2.855 1.922-5.055 4.725-5.055 2.761 0 4.725 2.268 4.725 5.055 0 2.844-1.91 5.056-4.725 5.056-2.788 0-4.725-2.212-4.725-5.056zm7.307 0c0-1.661-.866-3.159-2.583-3.159s-2.582 1.498-2.582 3.159c0 1.676.838 3.159 2.582 3.159 1.745.001 2.583-1.483 2.583-3.159zm2.615 0c0-2.855 1.923-5.055 4.725-5.055 2.76 0 4.725 2.268 4.725 5.055 0 2.844-1.909 5.056-4.725 5.056-2.789 0-4.725-2.212-4.725-5.056zm7.306 0c0-1.661-.864-3.159-2.581-3.159-1.718 0-2.582 1.498-2.582 3.159 0 1.676.838 3.159 2.582 3.159 1.743.001 2.581-1.483 2.581-3.159zm2.918-3.9c0-.688.44-1.072 1.03-1.072.261 0 .687.206.865.454l4.353 5.81h.028v-5.191c0-.688.439-1.072 1.031-1.072.589 0 1.029.385 1.029 1.072v7.802c0 .688-.44 1.072-1.029 1.072-.263 0-.675-.206-.866-.454l-4.354-5.741h-.027v5.123c0 .688-.44 1.072-1.03 1.072s-1.03-.385-1.03-1.072v-7.803z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3H2C.896 3 0 3.895 0 5v6c0 1.104.896 2 2 2h21.525v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM6.303 27.263c0 .537-.357 1.018-.921 1.018-.563 0-1.002-.412-1.826-.412-.591 0-1.126.316-1.126.893 0 1.414 4.587.509 4.587 4.052C7.017 34.776 5.396 36 3.501 36c-1.058 0-3.337-.248-3.337-1.539 0-.535.356-.976.92-.976.645 0 1.415.536 2.308.536.907 0 1.401-.509 1.401-1.182 0-1.62-4.588-.645-4.588-3.832 0-1.923 1.58-3.118 3.407-3.118.768.001 2.691.289 2.691 1.374zm1.213 3.681c0-2.855 1.922-5.055 4.725-5.055 2.761 0 4.725 2.268 4.725 5.055 0 2.844-1.91 5.056-4.725 5.056-2.788 0-4.725-2.212-4.725-5.056zm7.307 0c0-1.661-.866-3.159-2.583-3.159s-2.582 1.498-2.582 3.159c0 1.676.838 3.159 2.582 3.159 1.745.001 2.583-1.483 2.583-3.159zm2.615 0c0-2.855 1.923-5.055 4.725-5.055 2.76 0 4.725 2.268 4.725 5.055 0 2.844-1.909 5.056-4.725 5.056-2.789 0-4.725-2.212-4.725-5.056zm7.306 0c0-1.661-.864-3.159-2.581-3.159-1.718 0-2.582 1.498-2.582 3.159 0 1.676.838 3.159 2.582 3.159 1.743.001 2.581-1.483 2.581-3.159zm2.918-3.9c0-.688.44-1.072 1.03-1.072.261 0 .687.206.865.454l4.353 5.81h.028v-5.191c0-.688.439-1.072 1.031-1.072.589 0 1.029.385 1.029 1.072v7.802c0 .688-.44 1.072-1.029 1.072-.263 0-.675-.206-.866-.454l-4.354-5.741h-.027v5.123c0 .688-.44 1.072-1.03 1.072s-1.03-.385-1.03-1.072v-7.803z"/>
+</svg>
diff --git a/public/emoji/1f51d_border.svg b/public/emoji/1f51d_border.svg
new file mode 100644
index 000000000..a81b553f8
--- /dev/null
+++ b/public/emoji/1f51d_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M25.711 10.867L18.779.652c-.602-.885-1.558-.867-2.127.037l-6.39 10.141c-.569.904-.181 1.644.865 1.644H13V16c0 1.104.896 2 2 2h6c1.105 0 2-.896 2-2v-3.525h1.898c1.047 0 1.414-.723.813-1.608zM3.651 23.575H1.438c-.975 0-1.381-.712-1.381-1.401 0-.71.508-1.399 1.381-1.399h7.469c.874 0 1.381.689 1.381 1.399 0 .69-.406 1.401-1.381 1.401H6.696v10.189c0 1.016-.649 1.584-1.522 1.584s-1.522-.568-1.522-1.584V23.575zM10.396 28c0-4.222 2.841-7.471 6.982-7.471 4.079 0 6.983 3.351 6.983 7.471 0 4.201-2.821 7.471-6.983 7.471-4.121 0-6.982-3.27-6.982-7.471zm10.798 0c0-2.456-1.279-4.67-3.816-4.67s-3.816 2.214-3.816 4.67c0 2.476 1.239 4.668 3.816 4.668 2.578 0 3.816-2.192 3.816-4.668zm4.433-5.644c0-.954.569-1.582 1.585-1.582h3.591c2.985 0 5.197 1.947 5.197 4.851 0 2.963-2.293 4.811-5.074 4.811h-2.253v3.329c0 1.016-.649 1.584-1.521 1.584-.874 0-1.524-.568-1.524-1.584V22.356zm3.046 5.4h2.071c1.277 0 2.089-.934 2.089-2.151 0-1.219-.812-2.152-2.089-2.152h-2.071v4.303z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M25.711 10.867L18.779.652c-.602-.885-1.558-.867-2.127.037l-6.39 10.141c-.569.904-.181 1.644.865 1.644H13V16c0 1.104.896 2 2 2h6c1.105 0 2-.896 2-2v-3.525h1.898c1.047 0 1.414-.723.813-1.608zM3.651 23.575H1.438c-.975 0-1.381-.712-1.381-1.401 0-.71.508-1.399 1.381-1.399h7.469c.874 0 1.381.689 1.381 1.399 0 .69-.406 1.401-1.381 1.401H6.696v10.189c0 1.016-.649 1.584-1.522 1.584s-1.522-.568-1.522-1.584V23.575zM10.396 28c0-4.222 2.841-7.471 6.982-7.471 4.079 0 6.983 3.351 6.983 7.471 0 4.201-2.821 7.471-6.983 7.471-4.121 0-6.982-3.27-6.982-7.471zm10.798 0c0-2.456-1.279-4.67-3.816-4.67s-3.816 2.214-3.816 4.67c0 2.476 1.239 4.668 3.816 4.668 2.578 0 3.816-2.192 3.816-4.668zm4.433-5.644c0-.954.569-1.582 1.585-1.582h3.591c2.985 0 5.197 1.947 5.197 4.851 0 2.963-2.293 4.811-5.074 4.811h-2.253v3.329c0 1.016-.649 1.584-1.521 1.584-.874 0-1.524-.568-1.524-1.584V22.356zm3.046 5.4h2.071c1.277 0 2.089-.934 2.089-2.151 0-1.219-.812-2.152-2.089-2.152h-2.071v4.303z"/>
+</svg>
diff --git a/public/emoji/1f52a_border.svg b/public/emoji/1f52a_border.svg
new file mode 100644
index 000000000..0a9bdeab6
--- /dev/null
+++ b/public/emoji/1f52a_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35.875 34.604L19.796 15.113s-5.637 3.692-7.689 9.676c0 0 4.667 5.292 9.79 8.225 6.368 3.646 11.642 2.855 13.703 2.391.362-.081.511-.513.275-.801z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.071 13.005l-4.035 3.559c.066.028.316.45.174 1.107-.402 1.865-2.346 4.288-2.974 5.098-.194.25-.224.691.026 1.007l.845 1.013c1.821-3.964 6.556-8.694 7.689-9.676l-1.725-2.108z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.071 13.005s-3.32-4.216-5.763-6.986S8.208 1.658 6.625.64C5.01-.398 3.285.205 1.981 1.354S-.722 5.082.787 6.793c.826.937 2.785.078 3.791 1.219.683.774 1.031 1.365 3.464 3.859 3.759 3.854 5.994 4.692 5.994 4.692s1.251-1.042 1.932-1.648c.682-.604 2.103-1.91 2.103-1.91z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11.618" cy="10.543" r="1.365" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="5.903" cy="4.653" r="1.365" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M35.875 34.604L19.796 15.113s-5.637 3.692-7.689 9.676c0 0 4.667 5.292 9.79 8.225 6.368 3.646 11.642 2.855 13.703 2.391.362-.081.511-.513.275-.801z"/>
+  <path fill="#AAB8C2" d="M18.071 13.005l-4.035 3.559c.066.028.316.45.174 1.107-.402 1.865-2.346 4.288-2.974 5.098-.194.25-.224.691.026 1.007l.845 1.013c1.821-3.964 6.556-8.694 7.689-9.676l-1.725-2.108z"/>
+  <path fill="#31373D" d="M18.071 13.005s-3.32-4.216-5.763-6.986S8.208 1.658 6.625.64C5.01-.398 3.285.205 1.981 1.354S-.722 5.082.787 6.793c.826.937 2.785.078 3.791 1.219.683.774 1.031 1.365 3.464 3.859 3.759 3.854 5.994 4.692 5.994 4.692s1.251-1.042 1.932-1.648c.682-.604 2.103-1.91 2.103-1.91z"/>
+  <circle fill="#F5F8FA" cx="11.618" cy="10.543" r="1.365"/>
+  <circle fill="#F5F8FA" cx="5.903" cy="4.653" r="1.365"/>
+</svg>
diff --git a/public/emoji/1f54a_border.svg b/public/emoji/1f54a_border.svg
new file mode 100644
index 000000000..895872f3e
--- /dev/null
+++ b/public/emoji/1f54a_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M.794 16.112c1 0 5.875 1.344 6.5 2.312L6.013 18.3s-3.906-1.25-4.906-1.25c-1.001 0-.313-.938-.313-.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11 2c1 1 3 7 3 10s-2 6 2 8 5.001-1 5.001-5S20 7 19 5s-2 0-2 0-1-4-2-4-1 2-1 2-2-2-3-2 0 1 0 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 15c3 0 4 4 6 4s1-3 3-3 10-5 10-11 3-3 3-1c1 0 2 1.586 2 3 0 1 0 2-1 3 1 0 2 2 1 3 1 3-1 6-3 7 0 1-2 3-4 2 0 0-1 3-3 2 0 0 3.052 1.684 4 2 3 1 7 1 7 1s0 1-2 2c0 0 1 1 0 2s-2 1-2 1 1 2-2 1-6-4-6-4-5 1-9-1-6-6-6-8-3-1-4-1 2-2 3-2c0 0 0-2 3-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.95 18.019s5.438 2.625 7.938 6.656c1.9 3.064 2.782 8.656 2.782 8.656s.043.564-.907-2.281c-1-3-2.217-6.288-4.312-8.188-3.344-3.031-4.75-3.5-6.062-4.25-.332-.189.217-.687.561-.593z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16.198 28.54s2.038.103 3.107 2.139c1.068 2.036-.053 4.914-.053 4.914s-2.75-1.268-3.462-2.947c-.712-1.68.408-4.106.408-4.106zm-2.133-4.778s1.274 1.437 3.558 1.705c2.284.269 4.121-1.379 4.121-1.379s-2.144-1.97-3.968-2.033c-1.823-.065-3.711 1.707-3.711 1.707zm-4.047-3.148s-2.015.329-2.85 2.472.425 4.01.425 4.01 2.534-.848 3.055-2.597c.521-1.747-.63-3.885-.63-3.885z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#5C913B" d="M.794 16.112c1 0 5.875 1.344 6.5 2.312L6.013 18.3s-3.906-1.25-4.906-1.25c-1.001 0-.313-.938-.313-.938z"/>
+  <path fill="#99AAB5" d="M11 2c1 1 3 7 3 10s-2 6 2 8 5.001-1 5.001-5S20 7 19 5s-2 0-2 0-1-4-2-4-1 2-1 2-2-2-3-2 0 1 0 1z"/>
+  <path fill="#CCD6DD" d="M10 15c3 0 4 4 6 4s1-3 3-3 10-5 10-11 3-3 3-1c1 0 2 1.586 2 3 0 1 0 2-1 3 1 0 2 2 1 3 1 3-1 6-3 7 0 1-2 3-4 2 0 0-1 3-3 2 0 0 3.052 1.684 4 2 3 1 7 1 7 1s0 1-2 2c0 0 1 1 0 2s-2 1-2 1 1 2-2 1-6-4-6-4-5 1-9-1-6-6-6-8-3-1-4-1 2-2 3-2c0 0 0-2 3-2z"/>
+  <path fill="#5C913B" d="M6.95 18.019s5.438 2.625 7.938 6.656c1.9 3.064 2.782 8.656 2.782 8.656s.043.564-.907-2.281c-1-3-2.217-6.288-4.312-8.188-3.344-3.031-4.75-3.5-6.062-4.25-.332-.189.217-.687.561-.593z"/>
+  <path fill="#5C913B" d="M16.198 28.54s2.038.103 3.107 2.139c1.068 2.036-.053 4.914-.053 4.914s-2.75-1.268-3.462-2.947c-.712-1.68.408-4.106.408-4.106zm-2.133-4.778s1.274 1.437 3.558 1.705c2.284.269 4.121-1.379 4.121-1.379s-2.144-1.97-3.968-2.033c-1.823-.065-3.711 1.707-3.711 1.707zm-4.047-3.148s-2.015.329-2.85 2.472.425 4.01.425 4.01 2.534-.848 3.055-2.597c.521-1.747-.63-3.885-.63-3.885z"/>
+</svg>
diff --git a/public/emoji/1f54b_border.svg b/public/emoji/1f54b_border.svg
new file mode 100644
index 000000000..5f6d6f202
--- /dev/null
+++ b/public/emoji/1f54b_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 0L0 5v29l18 2 18-2V5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 36l18-2V5L18 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22.454 14.507v3.407l4.229.612V15.22zm7 1.181v3.239l3.299.478v-3.161zM18 13.756v3.513l1.683.244V14.04zm18 3.036l-.539-.091v3.096l.539.078z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M0 16.792v3.083l.539-.078v-3.096zm16.317-2.752v3.473L18 17.269v-3.513zm-13.07 2.204v3.161l3.299-.478v-3.239zm6.07-1.024v3.306l4.229-.612v-3.407z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.389 15.131v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152-.001-.482-.147-.886-.355-1.103zm6.999 1.069v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152 0-.481-.147-.885-.355-1.103zm6.017 1.03v-.039c0-.393-.134-.712-.299-.712-.165 0-.299.319-.299.712v.039c-.194.203-.331.58-.331 1.03 0 .479.151.886.367 1.076.059.182.152.308.263.308s.203-.126.263-.308c.215-.189.367-.597.367-1.076 0-.45-.136-.827-.331-1.03z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.611 15.131v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152.001-.482.147-.886.355-1.103zM7.612 16.2v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152 0-.481.147-.885.355-1.103zm-6.017 1.03v-.039c0-.393.134-.712.299-.712s.299.319.299.712v.039c.194.203.331.58.331 1.03 0 .479-.151.886-.367 1.076-.059.182-.152.308-.263.308s-.204-.127-.264-.308c-.215-.189-.367-.597-.367-1.076.001-.45.137-.827.332-1.03zM0 11.146v3.5l18-3.268V7.614z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 7.614v3.764l18 3.268v-3.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path d="M18 0L0 5v29l18 2 18-2V5z"/>
+  <path fill="#292F33" d="M18 36l18-2V5L18 0z"/>
+  <path fill="#FFD983" d="M22.454 14.507v3.407l4.229.612V15.22zm7 1.181v3.239l3.299.478v-3.161zM18 13.756v3.513l1.683.244V14.04zm18 3.036l-.539-.091v3.096l.539.078z"/>
+  <path fill="#FFAC33" d="M0 16.792v3.083l.539-.078v-3.096zm16.317-2.752v3.473L18 17.269v-3.513zm-13.07 2.204v3.161l3.299-.478v-3.239zm6.07-1.024v3.306l4.229-.612v-3.407z"/>
+  <path fill="#FFD983" d="M21.389 15.131v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152-.001-.482-.147-.886-.355-1.103zm6.999 1.069v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152 0-.481-.147-.885-.355-1.103zm6.017 1.03v-.039c0-.393-.134-.712-.299-.712-.165 0-.299.319-.299.712v.039c-.194.203-.331.58-.331 1.03 0 .479.151.886.367 1.076.059.182.152.308.263.308s.203-.126.263-.308c.215-.189.367-.597.367-1.076 0-.45-.136-.827-.331-1.03z"/>
+  <path fill="#FFAC33" d="M14.611 15.131v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152.001-.482.147-.886.355-1.103zM7.612 16.2v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152 0-.481.147-.885.355-1.103zm-6.017 1.03v-.039c0-.393.134-.712.299-.712s.299.319.299.712v.039c.194.203.331.58.331 1.03 0 .479-.151.886-.367 1.076-.059.182-.152.308-.263.308s-.204-.127-.264-.308c-.215-.189-.367-.597-.367-1.076.001-.45.137-.827.332-1.03zM0 11.146v3.5l18-3.268V7.614z"/>
+  <path fill="#FFD983" d="M18 7.614v3.764l18 3.268v-3.5z"/>
+</svg>
diff --git a/public/emoji/1f573_border.svg b/public/emoji/1f573_border.svg
new file mode 100644
index 000000000..7a8cf732e
--- /dev/null
+++ b/public/emoji/1f573_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 11.001c-9.389 0-17 3.358-17 7.5s7.611 7.5 17 7.5 17-3.358 17-7.5-7.611-7.5-17-7.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M33.871 19.284c.079-.256.129-.516.129-.783 0-1.418-1.16-2.676-3-3.699v2.778c1.083.51 2.05 1.08 2.871 1.704zM5 14.802c-1.84 1.023-3 2.281-3 3.699 0 .267.05.527.129.783C2.95 18.66 3.917 18.09 5 17.58v-2.778z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 12.001c-4.766 0-9.87 1.06-13 2.801v2.778c3.398-1.598 7.967-2.579 13-2.579s9.602.981 13 2.579v-2.778c-3.13-1.741-8.234-2.801-13-2.801z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M18 11.001c-9.389 0-17 3.358-17 7.5s7.611 7.5 17 7.5 17-3.358 17-7.5-7.611-7.5-17-7.5z"/>
+  <path fill="#7D8B93" d="M33.871 19.284c.079-.256.129-.516.129-.783 0-1.418-1.16-2.676-3-3.699v2.778c1.083.51 2.05 1.08 2.871 1.704zM5 14.802c-1.84 1.023-3 2.281-3 3.699 0 .267.05.527.129.783C2.95 18.66 3.917 18.09 5 17.58v-2.778z"/>
+  <path fill="#CCD6DD" d="M18 12.001c-4.766 0-9.87 1.06-13 2.801v2.778c3.398-1.598 7.967-2.579 13-2.579s9.602.981 13 2.579v-2.778c-3.13-1.741-8.234-2.801-13-2.801z"/>
+</svg>
diff --git a/public/emoji/1f576_border.svg b/public/emoji/1f576_border.svg
new file mode 100644
index 000000000..4ad1315ef
--- /dev/null
+++ b/public/emoji/1f576_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M1.24 15.018c.24.239 1.438.957 1.677 1.675.24.717.72 5.307 2.158 6.504 1.483 1.232 7.077.773 8.148.24 2.397-1.195 2.691-5.055 3.115-6.745.239-.957 1.677-.957 1.677-.957s1.438 0 1.678.956c.424 1.691.72 5.562 3.115 6.755 1.072.535 6.666.994 8.151-.238 1.436-1.197 1.915-5.799 2.155-6.517.238-.717 1.438-1.435 1.677-1.674.241-.239.241-1.196 0-1.436-.479-.478-6.134-.904-12.223-.239-1.215.133-1.677.478-4.554.478-2.875 0-3.339-.346-4.553-.478-6.085-.664-11.741-.238-12.221.24-.239.239-.239 1.197 0 1.436z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill-rule="evenodd" clip-rule="evenodd" fill="#31373D" d="M1.24 15.018c.24.239 1.438.957 1.677 1.675.24.717.72 5.307 2.158 6.504 1.483 1.232 7.077.773 8.148.24 2.397-1.195 2.691-5.055 3.115-6.745.239-.957 1.677-.957 1.677-.957s1.438 0 1.678.956c.424 1.691.72 5.562 3.115 6.755 1.072.535 6.666.994 8.151-.238 1.436-1.197 1.915-5.799 2.155-6.517.238-.717 1.438-1.435 1.677-1.674.241-.239.241-1.196 0-1.436-.479-.478-6.134-.904-12.223-.239-1.215.133-1.677.478-4.554.478-2.875 0-3.339-.346-4.553-.478-6.085-.664-11.741-.238-12.221.24-.239.239-.239 1.197 0 1.436z"/>
+</svg>
diff --git a/public/emoji/1f577_border.svg b/public/emoji/1f577_border.svg
new file mode 100644
index 000000000..bf3b8c7eb
--- /dev/null
+++ b/public/emoji/1f577_border.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M14.999 17c-.208 0-.419-.065-.599-.2C9.863 13.397 6.959 7.585 7 1.993c.004-.553.412-.975 1.007-.993.553.004.997.455.993 1.007-.037 4.98 2.554 10.159 6.6 13.193.442.331.531.958.2 1.4-.196.262-.497.4-.801.4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 19c-.377 0-9.273-.098-12.919-8.606-.218-.508.018-1.096.525-1.313.508-.218 1.096.018 1.313.525C8.052 16.916 15.677 17 16 17c.552 0 1 .448 1 1 0 .553-.448 1-1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4 29c-.104 0-.211-.017-.316-.052-.524-.174-.807-.74-.632-1.265 1.388-4.164 4.719-9.054 12.71-8.692.102.005.183.009.238.009.552 0 1 .447 1 1s-.448 1-1 1c-.076 0-.187-.005-.328-.011-5.411-.237-9.021 2.222-10.723 7.327-.14.419-.53.684-.949.684z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 36c-.552 0-1-.447-1-1 0-4.495 3.228-12.703 8.485-15.857.474-.284 1.088-.131 1.372.343s.131 1.088-.343 1.372C11.997 23.568 9 31.165 9 35c0 .553-.448 1-1 1zm13.001-19c-.305 0-.604-.138-.801-.4-.332-.442-.242-1.069.2-1.4 4.046-3.035 6.637-8.213 6.6-13.193-.004-.552.44-1.003.992-1.007H28c.549 0 .996.443 1 .993.042 5.592-2.863 11.404-7.4 14.807-.18.135-.39.2-.599.2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20 19c-.553 0-1-.447-1-1 0-.552.447-1 1-1 .323 0 7.948-.084 11.081-7.394.218-.507.808-.742 1.312-.525.508.217.743.805.525 1.313C29.272 18.902 20.377 19 20 19z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32 29c-.419 0-.809-.265-.948-.684-1.702-5.105-5.293-7.559-10.724-7.327-.141.006-.252.011-.328.011-.553 0-1-.447-1-1s.447-1 1-1c.055 0 .136-.004.238-.009 7.979-.36 11.323 4.528 12.71 8.692.175.524-.108 1.091-.632 1.265-.105.035-.212.052-.316.052z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 36c-.553 0-1-.447-1-1 0-3.835-2.997-11.432-7.515-14.143-.474-.284-.627-.898-.343-1.372.284-.473.897-.627 1.372-.343C25.771 22.297 29 30.505 29 35c0 .553-.447 1-1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="25.208" rx="6" ry="6.792" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="17" rx="4" ry="6" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 14c-.256 0-.512-.098-.707-.293C14 12.414 14 11.076 14 10c0-.552.448-1 1-1s1 .448 1 1c0 .92 0 1.586.707 2.293.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293zm4 0c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414C20 11.586 20 10.92 20 10c0-.552.447-1 1-1s1 .448 1 1c0 1.076 0 2.414-1.293 3.707-.195.195-.451.293-.707.293z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M14.999 17c-.208 0-.419-.065-.599-.2C9.863 13.397 6.959 7.585 7 1.993c.004-.553.412-.975 1.007-.993.553.004.997.455.993 1.007-.037 4.98 2.554 10.159 6.6 13.193.442.331.531.958.2 1.4-.196.262-.497.4-.801.4z"/>
+  <path fill="#31373D" d="M16 19c-.377 0-9.273-.098-12.919-8.606-.218-.508.018-1.096.525-1.313.508-.218 1.096.018 1.313.525C8.052 16.916 15.677 17 16 17c.552 0 1 .448 1 1 0 .553-.448 1-1 1z"/>
+  <path fill="#31373D" d="M4 29c-.104 0-.211-.017-.316-.052-.524-.174-.807-.74-.632-1.265 1.388-4.164 4.719-9.054 12.71-8.692.102.005.183.009.238.009.552 0 1 .447 1 1s-.448 1-1 1c-.076 0-.187-.005-.328-.011-5.411-.237-9.021 2.222-10.723 7.327-.14.419-.53.684-.949.684z"/>
+  <path fill="#31373D" d="M8 36c-.552 0-1-.447-1-1 0-4.495 3.228-12.703 8.485-15.857.474-.284 1.088-.131 1.372.343s.131 1.088-.343 1.372C11.997 23.568 9 31.165 9 35c0 .553-.448 1-1 1zm13.001-19c-.305 0-.604-.138-.801-.4-.332-.442-.242-1.069.2-1.4 4.046-3.035 6.637-8.213 6.6-13.193-.004-.552.44-1.003.992-1.007H28c.549 0 .996.443 1 .993.042 5.592-2.863 11.404-7.4 14.807-.18.135-.39.2-.599.2z"/>
+  <path fill="#31373D" d="M20 19c-.553 0-1-.447-1-1 0-.552.447-1 1-1 .323 0 7.948-.084 11.081-7.394.218-.507.808-.742 1.312-.525.508.217.743.805.525 1.313C29.272 18.902 20.377 19 20 19z"/>
+  <path fill="#31373D" d="M32 29c-.419 0-.809-.265-.948-.684-1.702-5.105-5.293-7.559-10.724-7.327-.141.006-.252.011-.328.011-.553 0-1-.447-1-1s.447-1 1-1c.055 0 .136-.004.238-.009 7.979-.36 11.323 4.528 12.71 8.692.175.524-.108 1.091-.632 1.265-.105.035-.212.052-.316.052z"/>
+  <path fill="#31373D" d="M28 36c-.553 0-1-.447-1-1 0-3.835-2.997-11.432-7.515-14.143-.474-.284-.627-.898-.343-1.372.284-.473.897-.627 1.372-.343C25.771 22.297 29 30.505 29 35c0 .553-.447 1-1 1z"/>
+  <ellipse fill="#31373D" cx="18" cy="25.208" rx="6" ry="6.792"/>
+  <ellipse fill="#31373D" cx="18" cy="17" rx="4" ry="6"/>
+  <path fill="#31373D" d="M16 14c-.256 0-.512-.098-.707-.293C14 12.414 14 11.076 14 10c0-.552.448-1 1-1s1 .448 1 1c0 .92 0 1.586.707 2.293.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293zm4 0c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414C20 11.586 20 10.92 20 10c0-.552.447-1 1-1s1 .448 1 1c0 1.076 0 2.414-1.293 3.707-.195.195-.451.293-.707.293z"/>
+</svg>
diff --git a/public/emoji/1f579_border.svg b/public/emoji/1f579_border.svg
new file mode 100644
index 000000000..f71237315
--- /dev/null
+++ b/public/emoji/1f579_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M16 9h4v17h-4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 24.5c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5S4.672 23 5.5 23h3c.828 0 1.5.672 1.5 1.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34 33c0 1.104-.896 2-2 2H4c-1.104 0-2-.896-2-2v-6c0-1.104.896-2 2-2h28c1.104 0 2 .896 2 2v6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 34.5c0 .828-.671 1.5-1.5 1.5h-3c-.829 0-1.5-.672-1.5-1.5S4.671 33 5.5 33h3c.829 0 1.5.672 1.5 1.5zm22 0c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5s.672-1.5 1.5-1.5h3c.828 0 1.5.672 1.5 1.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="7" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25 26c0 1.104-.896 2-2 2H13c-1.104 0-2-.896-2-2v-1c0-1.104 3.896-6 5-6h4c1.104 0 5 4.896 5 6v1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M33 28c0 .553-.447 1-1 1H4c-.552 0-1-.447-1-1 0-.553.448-1 1-1h28c.553 0 1 .447 1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M16 9h4v17h-4z"/>
+  <path fill="#DA2F47" d="M10 24.5c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5S4.672 23 5.5 23h3c.828 0 1.5.672 1.5 1.5z"/>
+  <path fill="#31373D" d="M34 33c0 1.104-.896 2-2 2H4c-1.104 0-2-.896-2-2v-6c0-1.104.896-2 2-2h28c1.104 0 2 .896 2 2v6z"/>
+  <path fill="#31373D" d="M10 34.5c0 .828-.671 1.5-1.5 1.5h-3c-.829 0-1.5-.672-1.5-1.5S4.671 33 5.5 33h3c.829 0 1.5.672 1.5 1.5zm22 0c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5s.672-1.5 1.5-1.5h3c.828 0 1.5.672 1.5 1.5z"/>
+  <circle fill="#DA2F47" cx="18" cy="7" r="5"/>
+  <path fill="#31373D" d="M25 26c0 1.104-.896 2-2 2H13c-1.104 0-2-.896-2-2v-1c0-1.104 3.896-6 5-6h4c1.104 0 5 4.896 5 6v1z"/>
+  <path fill="#66757F" d="M33 28c0 .553-.447 1-1 1H4c-.552 0-1-.447-1-1 0-.553.448-1 1-1h28c.553 0 1 .447 1 1z"/>
+</svg>
diff --git a/public/emoji/1f58a_border.svg b/public/emoji/1f58a_border.svg
new file mode 100644
index 000000000..42a312534
--- /dev/null
+++ b/public/emoji/1f58a_border.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M3.968 33.446C2.211 35.204.47 36.312.079 35.921c-.391-.391.718-2.132 2.475-3.889 1.757-1.758 3.498-2.866 3.889-2.475.39.391-.718 2.131-2.475 3.889z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.443 29.558l-2.122-2.122s-1.083 1.393-2.284 3.63C1.137 32.742.786 33.8.786 33.8l.707.707.707.707s1.059-.352 2.734-1.251c2.237-1.201 3.629-2.284 3.629-2.284l-2.12-2.121z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34.02 1.98c-3.535-3.536-18.164 10.297-18.871 11.004-.707.707-1.304 1.348-.928 1.724L12.1 16.829c-2.122 2.122-8.486 9.899-7.779 10.606l2.122 2.122 2.121 2.121c.707.707 8.485-5.657 10.607-7.778l2.121-2.121c.376.376 1.017-.222 1.724-.929.707-.706 14.54-15.334 11.004-18.87z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.016 20.851c.085-.084.362-.375.774-.817l-7.823-7.822c-.442.411-.732.689-.817.774-.707.707-1.304 1.348-.928 1.724l3.535 3.536 3.536 3.535c.375.374 1.016-.223 1.723-.93z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31.212 2.001C30.285 1.074 29.048.102 27.28.986c-1.768.884-7.313 4.441-9.878 7.005-1.322 1.322-1.247 2.102-.751 2.165.821.106 1.37.088 2.122-.663.75-.751.883-2.033.883-2.033s3.05-2.342 5.458-3.778c2.409-1.437 3.268-1.682 4.11-.84.842.842 1.988-.841 1.988-.841z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28.87 2.487l4.643 4.643c.353-.709.631-1.384.818-2.011l-3.45-3.45c-.627.188-1.301.466-2.011.818z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#C1694F" d="M3.968 33.446C2.211 35.204.47 36.312.079 35.921c-.391-.391.718-2.132 2.475-3.889 1.757-1.758 3.498-2.866 3.889-2.475.39.391-.718 2.131-2.475 3.889z"/>
+  <path fill="#FFCC4D" d="M6.443 29.558l-2.122-2.122s-1.083 1.393-2.284 3.63C1.137 32.742.786 33.8.786 33.8l.707.707.707.707s1.059-.352 2.734-1.251c2.237-1.201 3.629-2.284 3.629-2.284l-2.12-2.121z"/>
+  <path fill="#31373D" d="M34.02 1.98c-3.535-3.536-18.164 10.297-18.871 11.004-.707.707-1.304 1.348-.928 1.724L12.1 16.829c-2.122 2.122-8.486 9.899-7.779 10.606l2.122 2.122 2.121 2.121c.707.707 8.485-5.657 10.607-7.778l2.121-2.121c.376.376 1.017-.222 1.724-.929.707-.706 14.54-15.334 11.004-18.87z"/>
+  <path fill="#FFCC4D" d="M23.016 20.851c.085-.084.362-.375.774-.817l-7.823-7.822c-.442.411-.732.689-.817.774-.707.707-1.304 1.348-.928 1.724l3.535 3.536 3.536 3.535c.375.374 1.016-.223 1.723-.93z"/>
+  <path fill="#FFAC33" d="M31.212 2.001C30.285 1.074 29.048.102 27.28.986c-1.768.884-7.313 4.441-9.878 7.005-1.322 1.322-1.247 2.102-.751 2.165.821.106 1.37.088 2.122-.663.75-.751.883-2.033.883-2.033s3.05-2.342 5.458-3.778c2.409-1.437 3.268-1.682 4.11-.84.842.842 1.988-.841 1.988-.841z"/>
+  <path fill="#FFAC33" d="M28.87 2.487l4.643 4.643c.353-.709.631-1.384.818-2.011l-3.45-3.45c-.627.188-1.301.466-2.011.818z"/>
+</svg>
diff --git a/public/emoji/1f58b_border.svg b/public/emoji/1f58b_border.svg
new file mode 100644
index 000000000..f0a6459ca
--- /dev/null
+++ b/public/emoji/1f58b_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M4.167 32.729c.292.167.626.271.987.271 1.105 0 2-.896 2-2s-.895-2-2-2-2 .896-2 2c0 .361.103.695.27.987L.278 35.133 1.154 28l9-7 5 5-7 9-7.134.876 3.147-3.147z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22.511 5.308c-1.151 1.151-1.151 3.016 0 4.167l4.167 4.168c1.151 1.15 3.018 1.15 4.167 0l4.167-4.168c1.15-1.151 1.15-3.016 0-4.167l-4.167-4.167c-1.15-1.151-3.016-1.151-4.167 0l-4.167 4.167z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9.511 18.309L26.713 1.105l8.333 8.335-17.201 17.203c-1.15 1.15-3.016 1.15-4.168 0l-4.166-4.168c-1.151-1.151-1.151-3.016 0-4.166z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.469 10.35l2.125-2.125 8.334 8.334-2.125 2.125z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M4.167 32.729c.292.167.626.271.987.271 1.105 0 2-.896 2-2s-.895-2-2-2-2 .896-2 2c0 .361.103.695.27.987L.278 35.133 1.154 28l9-7 5 5-7 9-7.134.876 3.147-3.147z"/>
+  <path fill="#66757F" d="M22.511 5.308c-1.151 1.151-1.151 3.016 0 4.167l4.167 4.168c1.151 1.15 3.018 1.15 4.167 0l4.167-4.168c1.15-1.151 1.15-3.016 0-4.167l-4.167-4.167c-1.15-1.151-3.016-1.151-4.167 0l-4.167 4.167z"/>
+  <path fill="#31373D" d="M9.511 18.309L26.713 1.105l8.333 8.335-17.201 17.203c-1.15 1.15-3.016 1.15-4.168 0l-4.166-4.168c-1.151-1.151-1.151-3.016 0-4.166z"/>
+  <path fill="#66757F" d="M17.469 10.35l2.125-2.125 8.334 8.334-2.125 2.125z"/>
+</svg>
diff --git a/public/emoji/1f5a4_border.svg b/public/emoji/1f5a4_border.svg
new file mode 100644
index 000000000..63aa792ce
--- /dev/null
+++ b/public/emoji/1f5a4_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z"/>
+</svg>
diff --git a/public/emoji/1f5e3_border.svg b/public/emoji/1f5e3_border.svg
new file mode 100644
index 000000000..8920fb239
--- /dev/null
+++ b/public/emoji/1f5e3_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M35.838 23.159c.003.553-.443 1.002-.998 1.003l-5 .013c-.552.002-.999-.446-1-.997-.003-.555.444-1.002.995-1.004l5-.013c.553 0 1.002.445 1.003.998zm-1.587-5.489c.238.499.025 1.095-.475 1.333l-4.517 2.145c-.498.236-1.094.023-1.33-.476-.239-.498-.025-1.094.474-1.333l4.516-2.144c.5-.236 1.095-.024 1.332.475zm.027 10.987c.234-.501.02-1.096-.48-1.33l-4.527-2.122c-.501-.235-1.095-.02-1.33.48-.234.501-.019 1.096.482 1.33l4.526 2.123c.499.234 1.096.019 1.329-.481z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.979 14.875c-1.42-.419-2.693-1.547-3.136-2.25-.76-1.208.157-1.521-.153-4.889C24.405 4.653 20.16 1.337 15 1c-2.346-.153-4.786.326-7.286 1.693-6.42 3.511-8.964 10.932-4.006 18.099 4.47 6.46.276 9.379.276 9.379s.166 1.36 2.914 3.188c2.749 1.827 6.121.588 6.121.588s1.112-3.954 4.748-3.59c2.606.384 6.266-.129 7.191-1.024.865-.837-.151-1.886.539-4.224-2.365-.232-3.665-1.359-3.79-2.948 2.625.255 3.708-.578 4.458-1.495-.021-.54-.075-1.686-.127-2.454 2.322-.672 3.212-2.962 1.941-3.337z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FA743E" d="M35.838 23.159c.003.553-.443 1.002-.998 1.003l-5 .013c-.552.002-.999-.446-1-.997-.003-.555.444-1.002.995-1.004l5-.013c.553 0 1.002.445 1.003.998zm-1.587-5.489c.238.499.025 1.095-.475 1.333l-4.517 2.145c-.498.236-1.094.023-1.33-.476-.239-.498-.025-1.094.474-1.333l4.516-2.144c.5-.236 1.095-.024 1.332.475zm.027 10.987c.234-.501.02-1.096-.48-1.33l-4.527-2.122c-.501-.235-1.095-.02-1.33.48-.234.501-.019 1.096.482 1.33l4.526 2.123c.499.234 1.096.019 1.329-.481z"/>
+  <path fill="#269" d="M27.979 14.875c-1.42-.419-2.693-1.547-3.136-2.25-.76-1.208.157-1.521-.153-4.889C24.405 4.653 20.16 1.337 15 1c-2.346-.153-4.786.326-7.286 1.693-6.42 3.511-8.964 10.932-4.006 18.099 4.47 6.46.276 9.379.276 9.379s.166 1.36 2.914 3.188c2.749 1.827 6.121.588 6.121.588s1.112-3.954 4.748-3.59c2.606.384 6.266-.129 7.191-1.024.865-.837-.151-1.886.539-4.224-2.365-.232-3.665-1.359-3.79-2.948 2.625.255 3.708-.578 4.458-1.495-.021-.54-.075-1.686-.127-2.454 2.322-.672 3.212-2.962 1.941-3.337z"/>
+</svg>
diff --git a/public/emoji/1f983_border.svg b/public/emoji/1f983_border.svg
new file mode 100644
index 000000000..ccd557b04
--- /dev/null
+++ b/public/emoji/1f983_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M22.88 33.097c-.098-.18-.25-.302-.418-.391C20.865 31 22 28.999 22 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.486-.263.667-.869.404-1.355zm-7 0c-.097-.18-.25-.302-.417-.391C13.866 31 15 28.999 15 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.485-.263.666-.869.403-1.355z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5.134 7c2 5-3 5-2 7s5-2 3-7-1 0-1 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M7 6c0 1.104 1.933 2 0 2S0 7 0 6s1.067-3 3-3 4 1.896 4 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6 21C6 15 9.209 8 7 8 3 8 3 6.209 3 4s1.791-4 4-4c7 0 6 9 4 13-1.674 3.348-2.022 8-5 8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M36 17c0 7.959-5 11.3-10 11.249C23.966 30.045 21.073 31 18 31c-6.627 0-12-4.836-12-10.8 0-5.965 5.373-10.8 12-10.8 3-2.7 7-6.5 10-7.4 6 3.6 8 7.8 8 15z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6" cy="3" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.984 9.4c-1.626.002-3.174.297-4.585.829 3.914-.229 6.351-.042 9.602 1.552-.923-1.515-3.392-2.381-5.017-2.381zm17.942 5.435c-.086-1.278-.254-2.456-.52-3.545-6.25 1.272-3.404 3.545.52 3.545zm-1.985-7.223c-.676-1.154-1.541-2.205-2.623-3.186-7.162 3.574-3.006 4.73 2.623 3.186zm1.212 14.473c-3.402-1.085-4.247.821-2.215 3.415-2.5-2.344-4.031-1.062-3.344 2-1.469-2.188-2.969-.208-3.594.749 3.761.038 7.52-1.844 9.153-6.164zM31.315 4.424C30.378 3.574 29.286 2.771 28 2c-7 3.688-2 4.406 3.315 2.424zm3.838 17.66C35.691 20.66 36 18.973 36 17c0-.755-.027-1.471-.074-2.163-4.61.382-3.801 2.882.006 3.351-3.557.062-4.181 2.25-.779 3.896zm-1.21-14.469c-6.427 2.385-3.693 4.291 1.462 3.673-.328-1.344-.808-2.557-1.462-3.673z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M22.88 33.097c-.098-.18-.25-.302-.418-.391C20.865 31 22 28.999 22 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.486-.263.667-.869.404-1.355zm-7 0c-.097-.18-.25-.302-.417-.391C13.866 31 15 28.999 15 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.485-.263.666-.869.403-1.355z"/>
+  <path fill="#BE1931" d="M5.134 7c2 5-3 5-2 7s5-2 3-7-1 0-1 0z"/>
+  <path fill="#FFAC33" d="M7 6c0 1.104 1.933 2 0 2S0 7 0 6s1.067-3 3-3 4 1.896 4 3z"/>
+  <path fill="#C1694F" d="M6 21C6 15 9.209 8 7 8 3 8 3 6.209 3 4s1.791-4 4-4c7 0 6 9 4 13-1.674 3.348-2.022 8-5 8z"/>
+  <path fill="#31373D" d="M36 17c0 7.959-5 11.3-10 11.249C23.966 30.045 21.073 31 18 31c-6.627 0-12-4.836-12-10.8 0-5.965 5.373-10.8 12-10.8 3-2.7 7-6.5 10-7.4 6 3.6 8 7.8 8 15z"/>
+  <circle fill="#292F33" cx="6" cy="3" r="1"/>
+  <path fill="#66757F" d="M17.984 9.4c-1.626.002-3.174.297-4.585.829 3.914-.229 6.351-.042 9.602 1.552-.923-1.515-3.392-2.381-5.017-2.381zm17.942 5.435c-.086-1.278-.254-2.456-.52-3.545-6.25 1.272-3.404 3.545.52 3.545zm-1.985-7.223c-.676-1.154-1.541-2.205-2.623-3.186-7.162 3.574-3.006 4.73 2.623 3.186zm1.212 14.473c-3.402-1.085-4.247.821-2.215 3.415-2.5-2.344-4.031-1.062-3.344 2-1.469-2.188-2.969-.208-3.594.749 3.761.038 7.52-1.844 9.153-6.164zM31.315 4.424C30.378 3.574 29.286 2.771 28 2c-7 3.688-2 4.406 3.315 2.424zm3.838 17.66C35.691 20.66 36 18.973 36 17c0-.755-.027-1.471-.074-2.163-4.61.382-3.801 2.882.006 3.351-3.557.062-4.181 2.25-.779 3.896zm-1.21-14.469c-6.427 2.385-3.693 4.291 1.462 3.673-.328-1.344-.808-2.557-1.462-3.673z"/>
+</svg>
diff --git a/public/emoji/1f98d_border.svg b/public/emoji/1f98d_border.svg
new file mode 100644
index 000000000..1f022a9ba
--- /dev/null
+++ b/public/emoji/1f98d_border.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M5 16c0-4-5-3-4 1s3 5 3 5l1-6zm26 0c0-4 5-3 4 1s-3 5-3 5l-1-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.65 21.736c0 10.892-4.691 14.087-14.65 14.087-9.958 0-14.651-3.195-14.651-14.087S8.042.323 18 .323c9.959 0 14.65 10.521 14.65 21.413z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.567 23c1.49-4.458 2.088-7.312-.443-7.312H8.876c-2.532 0-1.933 2.854-.444 7.312C3.504 34.201 17.166 34.823 18 34.823S32.303 33.764 27.567 23z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15 18.003c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1zm10 0c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="15.572" cy="23.655" rx="1.428" ry="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.856 23.655c0 .553-.639 1-1.428 1-.79 0-1.429-.447-1.429-1 0-.553.639-1 1.429-1s1.428.448 1.428 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.02 21.04c-1.965-.26-3.02.834-3.02.834s-1.055-1.094-3.021-.834c-3.156.417-3.285 3.287-1.939 3.105.766-.104.135-.938 1.713-1.556 1.579-.616 3.247.66 3.247.66s1.667-1.276 3.246-.659.947 1.452 1.714 1.556c1.346.181 1.218-2.689-1.94-3.106z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.835 30.021c-1.209.323-3.204.596-6.835.596s-5.625-.272-6.835-.596c-3.205-.854-1.923-1.735 0-1.477 1.923.259 3.631.415 6.835.415 3.205 0 4.914-.156 6.835-.415 1.923-.258 3.204.623 0 1.477z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4.253 16.625c1.403-1.225-1.078-3.766-2.196-2.544-.341.373.921-.188 1.336 1.086.308.942.001 2.208.86 1.458zm27.493 0c-1.402-1.225 1.078-3.766 2.196-2.544.341.373-.921-.188-1.337 1.086-.306.942 0 2.208-.859 1.458z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M5 16c0-4-5-3-4 1s3 5 3 5l1-6zm26 0c0-4 5-3 4 1s-3 5-3 5l-1-6z"/>
+  <path fill="#31373D" d="M32.65 21.736c0 10.892-4.691 14.087-14.65 14.087-9.958 0-14.651-3.195-14.651-14.087S8.042.323 18 .323c9.959 0 14.65 10.521 14.65 21.413z"/>
+  <path fill="#66757F" d="M27.567 23c1.49-4.458 2.088-7.312-.443-7.312H8.876c-2.532 0-1.933 2.854-.444 7.312C3.504 34.201 17.166 34.823 18 34.823S32.303 33.764 27.567 23z"/>
+  <path fill="#31373D" d="M15 18.003c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1zm10 0c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1z"/>
+  <ellipse fill="#31373D" cx="15.572" cy="23.655" rx="1.428" ry="1"/>
+  <path fill="#31373D" d="M21.856 23.655c0 .553-.639 1-1.428 1-.79 0-1.429-.447-1.429-1 0-.553.639-1 1.429-1s1.428.448 1.428 1z"/>
+  <path fill="#99AAB5" d="M21.02 21.04c-1.965-.26-3.02.834-3.02.834s-1.055-1.094-3.021-.834c-3.156.417-3.285 3.287-1.939 3.105.766-.104.135-.938 1.713-1.556 1.579-.616 3.247.66 3.247.66s1.667-1.276 3.246-.659.947 1.452 1.714 1.556c1.346.181 1.218-2.689-1.94-3.106z"/>
+  <path fill="#31373D" d="M24.835 30.021c-1.209.323-3.204.596-6.835.596s-5.625-.272-6.835-.596c-3.205-.854-1.923-1.735 0-1.477 1.923.259 3.631.415 6.835.415 3.205 0 4.914-.156 6.835-.415 1.923-.258 3.204.623 0 1.477z"/>
+  <path fill="#66757F" d="M4.253 16.625c1.403-1.225-1.078-3.766-2.196-2.544-.341.373.921-.188 1.336 1.086.308.942.001 2.208.86 1.458zm27.493 0c-1.402-1.225 1.078-3.766 2.196-2.544.341.373-.921-.188-1.337 1.086-.306.942 0 2.208-.859 1.458z"/>
+</svg>
diff --git a/public/emoji/2122_border.svg b/public/emoji/2122_border.svg
new file mode 100644
index 000000000..f0fbee1b1
--- /dev/null
+++ b/public/emoji/2122_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M5.208 12.674H2.374c-1.248 0-1.768-.91-1.768-1.794 0-.91.65-1.794 1.768-1.794h9.568c1.118 0 1.768.884 1.768 1.794 0 .884-.52 1.794-1.768 1.794H9.108v13.053c0 1.299-.832 2.027-1.95 2.027-1.118 0-1.95-.729-1.95-2.027V12.674zm11.258-1.742c.156-.936 1.17-2.002 2.548-2.002 1.301 0 2.314.937 2.601 1.872l3.066 10.296h.053l3.068-10.296c.285-.936 1.301-1.872 2.6-1.872 1.379 0 2.393 1.066 2.549 2.002l2.418 14.507c.025.156.025.312.025.443 0 1.143-.832 1.871-1.871 1.871-1.326 0-1.848-.598-2.029-1.82l-1.533-10.581h-.053l-3.119 10.894c-.182.623-.676 1.508-2.08 1.508s-1.899-.885-2.08-1.508l-3.121-10.894h-.051l-1.535 10.581c-.182 1.223-.702 1.82-2.028 1.82-1.04 0-1.872-.729-1.872-1.871 0-.131 0-.287.026-.443l2.418-14.507z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path d="M5.208 12.674H2.374c-1.248 0-1.768-.91-1.768-1.794 0-.91.65-1.794 1.768-1.794h9.568c1.118 0 1.768.884 1.768 1.794 0 .884-.52 1.794-1.768 1.794H9.108v13.053c0 1.299-.832 2.027-1.95 2.027-1.118 0-1.95-.729-1.95-2.027V12.674zm11.258-1.742c.156-.936 1.17-2.002 2.548-2.002 1.301 0 2.314.937 2.601 1.872l3.066 10.296h.053l3.068-10.296c.285-.936 1.301-1.872 2.6-1.872 1.379 0 2.393 1.066 2.549 2.002l2.418 14.507c.025.156.025.312.025.443 0 1.143-.832 1.871-1.871 1.871-1.326 0-1.848-.598-2.029-1.82l-1.533-10.581h-.053l-3.119 10.894c-.182.623-.676 1.508-2.08 1.508s-1.899-.885-2.08-1.508l-3.121-10.894h-.051l-1.535 10.581c-.182 1.223-.702 1.82-2.028 1.82-1.04 0-1.872-.729-1.872-1.871 0-.131 0-.287.026-.443l2.418-14.507z" fill="#31373D"/>
+</svg>
diff --git a/public/emoji/25aa_border.svg b/public/emoji/25aa_border.svg
new file mode 100644
index 000000000..220eb4345
--- /dev/null
+++ b/public/emoji/25aa_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z"/>
+</svg>
diff --git a/public/emoji/25ab_border.svg b/public/emoji/25ab_border.svg
new file mode 100644
index 000000000..b51e1a9cc
--- /dev/null
+++ b/public/emoji/25ab_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z"/>
+</svg>
diff --git a/public/emoji/25fb_border.svg b/public/emoji/25fb_border.svg
new file mode 100644
index 000000000..24c48e17a
--- /dev/null
+++ b/public/emoji/25fb_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z"/>
+</svg>
diff --git a/public/emoji/25fc_border.svg b/public/emoji/25fc_border.svg
new file mode 100644
index 000000000..345e972ed
--- /dev/null
+++ b/public/emoji/25fc_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z"/>
+</svg>
diff --git a/public/emoji/25fd_border.svg b/public/emoji/25fd_border.svg
new file mode 100644
index 000000000..ec7278674
--- /dev/null
+++ b/public/emoji/25fd_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z"/>
+</svg>
diff --git a/public/emoji/25fe_border.svg b/public/emoji/25fe_border.svg
new file mode 100644
index 000000000..775bb6718
--- /dev/null
+++ b/public/emoji/25fe_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z"/>
+</svg>
diff --git a/public/emoji/2601_border.svg b/public/emoji/2601_border.svg
new file mode 100644
index 000000000..6ab20d737
--- /dev/null
+++ b/public/emoji/2601_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M27 8c-.701 0-1.377.106-2.015.298.005-.1.015-.197.015-.298 0-3.313-2.687-6-6-6-2.769 0-5.093 1.878-5.785 4.427C12.529 6.154 11.783 6 11 6c-3.314 0-6 2.686-6 6 0 3.312 2.686 6 6 6 2.769 0 5.093-1.878 5.785-4.428.686.273 1.432.428 2.215.428.375 0 .74-.039 1.096-.104-.058.36-.096.727-.096 1.104 0 3.865 3.135 7 7 7s7-3.135 7-7c0-3.866-3.135-7-7-7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31 22c-.467 0-.91.085-1.339.204.216-.526.339-1.1.339-1.704 0-2.485-2.015-4.5-4.5-4.5-1.019 0-1.947.351-2.701.921C22.093 14.096 19.544 12 16.5 12c-2.838 0-5.245 1.822-6.131 4.357C9.621 16.125 8.825 16 8 16c-4.418 0-8 3.582-8 8 0 4.419 3.582 8 8 8h23c2.762 0 5-2.238 5-5s-2.238-5-5-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M27 8c-.701 0-1.377.106-2.015.298.005-.1.015-.197.015-.298 0-3.313-2.687-6-6-6-2.769 0-5.093 1.878-5.785 4.427C12.529 6.154 11.783 6 11 6c-3.314 0-6 2.686-6 6 0 3.312 2.686 6 6 6 2.769 0 5.093-1.878 5.785-4.428.686.273 1.432.428 2.215.428.375 0 .74-.039 1.096-.104-.058.36-.096.727-.096 1.104 0 3.865 3.135 7 7 7s7-3.135 7-7c0-3.866-3.135-7-7-7z"/>
+  <path fill="#E1E8ED" d="M31 22c-.467 0-.91.085-1.339.204.216-.526.339-1.1.339-1.704 0-2.485-2.015-4.5-4.5-4.5-1.019 0-1.947.351-2.701.921C22.093 14.096 19.544 12 16.5 12c-2.838 0-5.245 1.822-6.131 4.357C9.621 16.125 8.825 16 8 16c-4.418 0-8 3.582-8 8 0 4.419 3.582 8 8 8h23c2.762 0 5-2.238 5-5s-2.238-5-5-5z"/>
+</svg>
diff --git a/public/emoji/2620_border.svg b/public/emoji/2620_border.svg
new file mode 100644
index 000000000..8878828be
--- /dev/null
+++ b/public/emoji/2620_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M27.865 16.751c0-6.242-4.411-9.988-9.927-9.988s-9.835 3.746-9.835 9.988c0 3.48-.103 6.485 3.897 7.89v2.722c0 1.034.966 1.872 2 1.872 1.035 0 2-.838 2-1.872v-1.97 1.97c0 1.034.965 1.872 2 1.872 1.036 0 2-.838 2-1.872v-1.97 1.97c0 1.034.966 1.872 2 1.872s2-.838 2-1.872v-2.722c4-1.405 3.865-4.41 3.865-7.89z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13.629" cy="15.503" r="3.121" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.488 15.503c0 1.724 0 3.121-3.121 3.121-3.12 0-3.12-1.397-3.12-3.121s1.396-3.121 3.12-3.121c1.725 0 3.121 1.397 3.121 3.121zm-6.301 5.656c-.157-.382-.626-.662-1.189-.662-.561 0-1.031.28-1.188.662-.394.11-.685.469-.685.898 0 .517.419.936.937.936.409 0 .753-.263.88-.628.019 0 .037.004.056.004.019 0 .037-.004.057-.004.128.365.472.628.88.628.517 0 .936-.419.936-.936 0-.429-.291-.786-.684-.898z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11 27c0-.367.075-.713.195-1.038-.984-.447-1.831-1.082-2.503-1.97-1.107.969-2.163 1.876-3.127 2.695C4.985 26.26 4.275 26 3.5 26 1.567 26 0 27.566 0 29.5c0 1.778 1.33 3.229 3.046 3.454C3.271 34.671 4.722 36 6.5 36c1.933 0 3.5-1.566 3.5-3.5 0-.775-.26-1.485-.686-2.065.6-.706 1.246-1.46 1.931-2.25C11.088 27.821 11 27.421 11 27zm16.872-15.482c.884-.769 1.729-1.495 2.515-2.163.569.403 1.262.645 2.013.645 1.934 0 3.5-1.567 3.5-3.5 0-1.743-1.277-3.177-2.945-3.444C32.735 1.335 31.281 0 29.5 0 27.566 0 26 1.567 26 3.5c0 .775.26 1.485.687 2.065-.594.7-1.233 1.445-1.911 2.227 1.3.871 2.361 2.095 3.096 3.726zM3.5 10c.775 0 1.485-.26 2.065-.687.799.679 1.661 1.419 2.564 2.204.735-1.631 1.795-2.855 3.096-3.726-.679-.781-1.317-1.527-1.912-2.226.427-.58.687-1.29.687-2.065C10 1.567 8.433 0 6.5 0 4.722 0 3.271 1.33 3.046 3.046 1.33 3.271 0 4.722 0 6.5 0 8.433 1.567 10 3.5 10zm28.9 16c-.752 0-1.444.242-2.014.645-.952-.809-1.99-1.701-3.079-2.653-.672.889-1.519 1.523-2.503 1.971.121.324.196.67.196 1.037 0 .421-.088.821-.245 1.185.685.79 1.331 1.544 1.931 2.25-.426.58-.686 1.29-.686 2.065 0 1.934 1.566 3.5 3.5 3.5 1.781 0 3.235-1.334 3.455-3.056 1.668-.267 2.945-1.701 2.945-3.444 0-1.934-1.566-3.5-3.5-3.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M27.865 16.751c0-6.242-4.411-9.988-9.927-9.988s-9.835 3.746-9.835 9.988c0 3.48-.103 6.485 3.897 7.89v2.722c0 1.034.966 1.872 2 1.872 1.035 0 2-.838 2-1.872v-1.97 1.97c0 1.034.965 1.872 2 1.872 1.036 0 2-.838 2-1.872v-1.97 1.97c0 1.034.966 1.872 2 1.872s2-.838 2-1.872v-2.722c4-1.405 3.865-4.41 3.865-7.89z"/>
+  <circle fill="#292F33" cx="13.629" cy="15.503" r="3.121"/>
+  <path fill="#292F33" d="M25.488 15.503c0 1.724 0 3.121-3.121 3.121-3.12 0-3.12-1.397-3.12-3.121s1.396-3.121 3.12-3.121c1.725 0 3.121 1.397 3.121 3.121zm-6.301 5.656c-.157-.382-.626-.662-1.189-.662-.561 0-1.031.28-1.188.662-.394.11-.685.469-.685.898 0 .517.419.936.937.936.409 0 .753-.263.88-.628.019 0 .037.004.056.004.019 0 .037-.004.057-.004.128.365.472.628.88.628.517 0 .936-.419.936-.936 0-.429-.291-.786-.684-.898z"/>
+  <path d="M11 27c0-.367.075-.713.195-1.038-.984-.447-1.831-1.082-2.503-1.97-1.107.969-2.163 1.876-3.127 2.695C4.985 26.26 4.275 26 3.5 26 1.567 26 0 27.566 0 29.5c0 1.778 1.33 3.229 3.046 3.454C3.271 34.671 4.722 36 6.5 36c1.933 0 3.5-1.566 3.5-3.5 0-.775-.26-1.485-.686-2.065.6-.706 1.246-1.46 1.931-2.25C11.088 27.821 11 27.421 11 27zm16.872-15.482c.884-.769 1.729-1.495 2.515-2.163.569.403 1.262.645 2.013.645 1.934 0 3.5-1.567 3.5-3.5 0-1.743-1.277-3.177-2.945-3.444C32.735 1.335 31.281 0 29.5 0 27.566 0 26 1.567 26 3.5c0 .775.26 1.485.687 2.065-.594.7-1.233 1.445-1.911 2.227 1.3.871 2.361 2.095 3.096 3.726zM3.5 10c.775 0 1.485-.26 2.065-.687.799.679 1.661 1.419 2.564 2.204.735-1.631 1.795-2.855 3.096-3.726-.679-.781-1.317-1.527-1.912-2.226.427-.58.687-1.29.687-2.065C10 1.567 8.433 0 6.5 0 4.722 0 3.271 1.33 3.046 3.046 1.33 3.271 0 4.722 0 6.5 0 8.433 1.567 10 3.5 10zm28.9 16c-.752 0-1.444.242-2.014.645-.952-.809-1.99-1.701-3.079-2.653-.672.889-1.519 1.523-2.503 1.971.121.324.196.67.196 1.037 0 .421-.088.821-.245 1.185.685.79 1.331 1.544 1.931 2.25-.426.58-.686 1.29-.686 2.065 0 1.934 1.566 3.5 3.5 3.5 1.781 0 3.235-1.334 3.455-3.056 1.668-.267 2.945-1.701 2.945-3.444 0-1.934-1.566-3.5-3.5-3.5z" fill="#AAB8C2"/>
+</svg>
diff --git a/public/emoji/2660_border.svg b/public/emoji/2660_border.svg
new file mode 100644
index 000000000..3ce65b4eb
--- /dev/null
+++ b/public/emoji/2660_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M32.799 20.336C32.799 11.456 18 .198 18 .198S3.201 11.456 3.201 20.336c0 6.946 8.175 10.172 12.766 5.173C15.631 29.688 11.247 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.246 0-8.632-3.312-8.967-7.491 4.591 4.999 12.766 1.773 12.766-5.173z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M32.799 20.336C32.799 11.456 18 .198 18 .198S3.201 11.456 3.201 20.336c0 6.946 8.175 10.172 12.766 5.173C15.631 29.688 11.247 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.246 0-8.632-3.312-8.967-7.491 4.591 4.999 12.766 1.773 12.766-5.173z"/>
+</svg>
diff --git a/public/emoji/2663_border.svg b/public/emoji/2663_border.svg
new file mode 100644
index 000000000..3fcf5c75e
--- /dev/null
+++ b/public/emoji/2663_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25.5 28c4.143 0 7.5-3.358 7.5-7.5 0-4.142-3.357-7.5-7.5-7.5-1.359 0-2.631.367-3.73 1h-.21c2.047-1.217 3.423-3.445 3.423-6 0-3.857-3.126-6.984-6.983-6.984S11.016 4.143 11.016 8c0 2.555 1.376 4.783 3.423 6h-.208c-1.1-.633-2.371-1-3.731-1C6.358 13 3 16.358 3 20.5c0 4.142 3.358 7.5 7.5 7.5 2.155 0 4.091-.914 5.46-2.368C15.549 29.753 11.205 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.205 0-8.549-3.248-8.959-7.369C21.408 27.086 23.346 28 25.5 28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M25.5 28c4.143 0 7.5-3.358 7.5-7.5 0-4.142-3.357-7.5-7.5-7.5-1.359 0-2.631.367-3.73 1h-.21c2.047-1.217 3.423-3.445 3.423-6 0-3.857-3.126-6.984-6.983-6.984S11.016 4.143 11.016 8c0 2.555 1.376 4.783 3.423 6h-.208c-1.1-.633-2.371-1-3.731-1C6.358 13 3 16.358 3 20.5c0 4.142 3.358 7.5 7.5 7.5 2.155 0 4.091-.914 5.46-2.368C15.549 29.753 11.205 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.205 0-8.549-3.248-8.959-7.369C21.408 27.086 23.346 28 25.5 28z"/>
+</svg>
diff --git a/public/emoji/26aa_border.svg b/public/emoji/26aa_border.svg
new file mode 100644
index 000000000..d2cac5cad
--- /dev/null
+++ b/public/emoji/26aa_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#E6E7E8" cx="18" cy="18" r="18"/>
+</svg>
diff --git a/public/emoji/26ab_border.svg b/public/emoji/26ab_border.svg
new file mode 100644
index 000000000..617df7493
--- /dev/null
+++ b/public/emoji/26ab_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#31373D" cx="18" cy="18" r="18"/>
+</svg>
diff --git a/public/emoji/26be_border.svg b/public/emoji/26be_border.svg
new file mode 100644
index 000000000..25954deac
--- /dev/null
+++ b/public/emoji/26be_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31.802 29.546C28.792 28.221 27 24.048 27 18c0-6.048 1.792-10.221 4.802-11.546-.445-.531-.926-1.028-1.428-1.504C27.406 6.605 25 10.578 25 18c0 7.421 2.406 11.395 5.374 13.05.502-.477.984-.973 1.428-1.504zM11 18c0-7.421-2.406-11.395-5.374-13.049-.502.476-.984.972-1.428 1.503C7.208 7.78 9 11.952 9 18c0 6.048-1.792 10.22-4.802 11.546.445.531.926 1.027 1.428 1.504C8.593 29.395 11 25.421 11 18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5.092 10.164c-.237 0-.457-.02-.651-.056-.543-.102-.9-.624-.799-1.167.102-.543.625-.902 1.167-.799.43.077 2.691.006 3.148-2.276.108-.541.632-.892 1.177-.784.542.108.893.635.784 1.177-.583 2.912-3.139 3.905-4.826 3.905zm1.7 3.961c-.53 0-.952-.323-.978-.859-.026-.551.4-.911.952-.937 0 0 2.564-.035 3.869-2.294.275-.478.886-.63 1.365-.352.478.276.642.894.365 1.373-1.851 3.206-5.557 3.069-5.573 3.069zM9 19.282c-.734 0-1.414-.135-1.928-.378-.499-.236-.712-.833-.476-1.332.237-.5.834-.711 1.332-.476.83.393 2.926.239 3.73-1.012.299-.465.917-.6 1.382-.301.465.299.599.918.301 1.382-.964 1.501-2.776 2.117-4.341 2.117zm1.161 5.525c-1.554 0-2.995-.699-3.926-1.476-.424-.354-.481-.984-.128-1.409.354-.425.984-.48 1.408-.128.194.163 1.952 1.566 3.782.785.507-.215 1.095.021 1.311.53.216.509-.021 1.096-.53 1.312-.639.271-1.288.386-1.917.386zM9.75 30h-.028c-2.504 0-4.679-1.57-5.534-3.108-.269-.482-.094-1.044.388-1.312.483-.269 1.092-.07 1.36.412.484.871 1.996 2.134 3.841 2.185.552.016.987.388.972.939-.015.542-.459.884-.999.884zm17.438.188c-.066 0-.131-.006-.197-.02-.541-.108-.893-.635-.784-1.177.664-3.322 3.894-4.15 5.478-3.849.543.102.9.624.798 1.167-.101.542-.617.903-1.167.798-.425-.08-2.69-.007-3.147 2.276-.096.476-.514.805-.981.805zm-2.564-4.5c-.17 0-.342-.043-.499-.134-.479-.276-.643-.889-.366-1.366 1.852-3.206 3.984-3.304 5.394-3.369l.111-.005c.539-.033 1.021.399 1.047.951.026.552-.399 1.021-.951 1.047l-.115.005c-1.204.056-2.449.112-3.754 2.371-.185.321-.521.5-.867.5zm-1-6.063c-.186 0-.372-.051-.54-.159-.464-.298-.599-.917-.3-1.381 1.415-2.203 4.656-2.501 6.268-1.738.499.236.713.833.476 1.332-.235.5-.834.712-1.331.476-.829-.393-2.926-.239-3.732 1.012-.19.296-.512.458-.841.458zm5.625-5.937c-.226 0-.452-.076-.64-.232-.194-.162-1.952-1.559-3.781-.785-.509.215-1.095-.021-1.312-.53-.216-.508.021-1.096.53-1.311 2.219-.942 4.535-.001 5.844 1.09.424.353.482.984.128 1.408-.198.237-.482.36-.769.36zm1.814-3.938c-.352 0-.692-.186-.875-.514-.484-.872-1.996-2.123-3.841-2.174-.553-.015-.987-.506-.973-1.059.017-.542.461-1.003 1-1.003h.028c2.505 0 4.68 1.694 5.534 3.232.269.483.095 1.108-.389 1.376-.152.086-.319.142-.484.142z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#E1E8ED" cx="18" cy="18" r="18"/>
+  <path fill="#B3BEC4" d="M31.802 29.546C28.792 28.221 27 24.048 27 18c0-6.048 1.792-10.221 4.802-11.546-.445-.531-.926-1.028-1.428-1.504C27.406 6.605 25 10.578 25 18c0 7.421 2.406 11.395 5.374 13.05.502-.477.984-.973 1.428-1.504zM11 18c0-7.421-2.406-11.395-5.374-13.049-.502.476-.984.972-1.428 1.503C7.208 7.78 9 11.952 9 18c0 6.048-1.792 10.22-4.802 11.546.445.531.926 1.027 1.428 1.504C8.593 29.395 11 25.421 11 18z"/>
+  <path d="M5.092 10.164c-.237 0-.457-.02-.651-.056-.543-.102-.9-.624-.799-1.167.102-.543.625-.902 1.167-.799.43.077 2.691.006 3.148-2.276.108-.541.632-.892 1.177-.784.542.108.893.635.784 1.177-.583 2.912-3.139 3.905-4.826 3.905zm1.7 3.961c-.53 0-.952-.323-.978-.859-.026-.551.4-.911.952-.937 0 0 2.564-.035 3.869-2.294.275-.478.886-.63 1.365-.352.478.276.642.894.365 1.373-1.851 3.206-5.557 3.069-5.573 3.069zM9 19.282c-.734 0-1.414-.135-1.928-.378-.499-.236-.712-.833-.476-1.332.237-.5.834-.711 1.332-.476.83.393 2.926.239 3.73-1.012.299-.465.917-.6 1.382-.301.465.299.599.918.301 1.382-.964 1.501-2.776 2.117-4.341 2.117zm1.161 5.525c-1.554 0-2.995-.699-3.926-1.476-.424-.354-.481-.984-.128-1.409.354-.425.984-.48 1.408-.128.194.163 1.952 1.566 3.782.785.507-.215 1.095.021 1.311.53.216.509-.021 1.096-.53 1.312-.639.271-1.288.386-1.917.386zM9.75 30h-.028c-2.504 0-4.679-1.57-5.534-3.108-.269-.482-.094-1.044.388-1.312.483-.269 1.092-.07 1.36.412.484.871 1.996 2.134 3.841 2.185.552.016.987.388.972.939-.015.542-.459.884-.999.884zm17.438.188c-.066 0-.131-.006-.197-.02-.541-.108-.893-.635-.784-1.177.664-3.322 3.894-4.15 5.478-3.849.543.102.9.624.798 1.167-.101.542-.617.903-1.167.798-.425-.08-2.69-.007-3.147 2.276-.096.476-.514.805-.981.805zm-2.564-4.5c-.17 0-.342-.043-.499-.134-.479-.276-.643-.889-.366-1.366 1.852-3.206 3.984-3.304 5.394-3.369l.111-.005c.539-.033 1.021.399 1.047.951.026.552-.399 1.021-.951 1.047l-.115.005c-1.204.056-2.449.112-3.754 2.371-.185.321-.521.5-.867.5zm-1-6.063c-.186 0-.372-.051-.54-.159-.464-.298-.599-.917-.3-1.381 1.415-2.203 4.656-2.501 6.268-1.738.499.236.713.833.476 1.332-.235.5-.834.712-1.331.476-.829-.393-2.926-.239-3.732 1.012-.19.296-.512.458-.841.458zm5.625-5.937c-.226 0-.452-.076-.64-.232-.194-.162-1.952-1.559-3.781-.785-.509.215-1.095-.021-1.312-.53-.216-.508.021-1.096.53-1.311 2.219-.942 4.535-.001 5.844 1.09.424.353.482.984.128 1.408-.198.237-.482.36-.769.36zm1.814-3.938c-.352 0-.692-.186-.875-.514-.484-.872-1.996-2.123-3.841-2.174-.553-.015-.987-.506-.973-1.059.017-.542.461-1.003 1-1.003h.028c2.505 0 4.68 1.694 5.534 3.232.269.483.095 1.108-.389 1.376-.152.086-.319.142-.484.142z" fill="#DD2E44"/>
+</svg>
diff --git a/public/emoji/26f8_border.svg b/public/emoji/26f8_border.svg
new file mode 100644
index 000000000..0df7ff2ff
--- /dev/null
+++ b/public/emoji/26f8_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M26 33c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3zm-14 0c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M30 36H2c-1.104 0-2.104-3-1-3h28c3 0 3-3 4-4 5 3 2 7-3 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M1 28c0-9 2-14 2-21 0-2.279 13-2 13 0s-1.5 10 5 13c6.268 2.893 15 2 15 8H1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M36 28c-24 0-19.001-1-25-1H1v1c0 1.104.896 2 2 2h8c2.333 0 .398-2.041 3-1 5 2 20 1 20 1 1.104 0 2-.896 2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16.312 20.75c-.25 0-.5-.093-.694-.28-.398-.383-.409-1.017-.025-1.414l1.688-1.75c.384-.396 1.017-.408 1.414-.025.398.383.409 1.016.025 1.414l-1.688 1.75c-.196.202-.458.305-.72.305zM19.999 23c-.15 0-.303-.034-.446-.105-.494-.247-.694-.848-.447-1.342l1-2c.248-.494.848-.692 1.342-.447.494.247.694.848.447 1.342l-1 2c-.176.35-.529.552-.896.552zm4.002 1c-.047 0-.095-.003-.143-.01-.547-.079-.927-.585-.849-1.132l.209-1.458c.079-.547.587-.923 1.132-.849.547.079.927.585.849 1.132l-.209 1.458c-.072.5-.5.859-.989.859z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M26 33c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3zm-14 0c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3z"/>
+  <path fill="#99AAB5" d="M30 36H2c-1.104 0-2.104-3-1-3h28c3 0 3-3 4-4 5 3 2 7-3 7z"/>
+  <path fill="#E6E7E8" d="M1 28c0-9 2-14 2-21 0-2.279 13-2 13 0s-1.5 10 5 13c6.268 2.893 15 2 15 8H1z"/>
+  <path fill="#E6E7E8" d="M36 28c-24 0-19.001-1-25-1H1v1c0 1.104.896 2 2 2h8c2.333 0 .398-2.041 3-1 5 2 20 1 20 1 1.104 0 2-.896 2-2z"/>
+  <path fill="#DD2E44" d="M16.312 20.75c-.25 0-.5-.093-.694-.28-.398-.383-.409-1.017-.025-1.414l1.688-1.75c.384-.396 1.017-.408 1.414-.025.398.383.409 1.016.025 1.414l-1.688 1.75c-.196.202-.458.305-.72.305zM19.999 23c-.15 0-.303-.034-.446-.105-.494-.247-.694-.848-.447-1.342l1-2c.248-.494.848-.692 1.342-.447.494.247.694.848.447 1.342l-1 2c-.176.35-.529.552-.896.552zm4.002 1c-.047 0-.095-.003-.143-.01-.547-.079-.927-.585-.849-1.132l.209-1.458c.079-.547.587-.923 1.132-.849.547.079.927.585.849 1.132l-.209 1.458c-.072.5-.5.859-.989.859z"/>
+</svg>
diff --git a/public/emoji/2712_border.svg b/public/emoji/2712_border.svg
new file mode 100644
index 000000000..6e9e1c019
--- /dev/null
+++ b/public/emoji/2712_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M31.986 32.729c-.292.167-.626.271-.987.271-1.104 0-2-.896-2-2s.896-2 2-2 2 .896 2 2c0 .361-.104.695-.271.987l3.146 3.146L34.999 28l-9-7-5 5 7 9 7.134.876-3.147-3.147z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.643 5.308c1.151 1.151 1.151 3.016 0 4.167l-4.167 4.168c-1.151 1.15-3.018 1.15-4.167 0L1.141 9.475c-1.15-1.151-1.15-3.016 0-4.167l4.167-4.167c1.15-1.151 3.016-1.151 4.167 0l4.168 4.167z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M26.643 18.309L9.44 1.105 1.107 9.44l17.202 17.202c1.15 1.15 3.016 1.15 4.168 0l4.166-4.168c1.15-1.15 1.15-3.015 0-4.165z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8.225 16.56l8.334-8.335 2.124 2.125-8.333 8.334z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M31.986 32.729c-.292.167-.626.271-.987.271-1.104 0-2-.896-2-2s.896-2 2-2 2 .896 2 2c0 .361-.104.695-.271.987l3.146 3.146L34.999 28l-9-7-5 5 7 9 7.134.876-3.147-3.147z"/>
+  <path fill="#66757F" d="M13.643 5.308c1.151 1.151 1.151 3.016 0 4.167l-4.167 4.168c-1.151 1.15-3.018 1.15-4.167 0L1.141 9.475c-1.15-1.151-1.15-3.016 0-4.167l4.167-4.167c1.15-1.151 3.016-1.151 4.167 0l4.168 4.167z"/>
+  <path fill="#31373D" d="M26.643 18.309L9.44 1.105 1.107 9.44l17.202 17.202c1.15 1.15 3.016 1.15 4.168 0l4.166-4.168c1.15-1.15 1.15-3.015 0-4.165z"/>
+  <path fill="#66757F" d="M8.225 16.56l8.334-8.335 2.124 2.125-8.333 8.334z"/>
+</svg>
diff --git a/public/emoji/2714_border.svg b/public/emoji/2714_border.svg
new file mode 100644
index 000000000..a90dd10eb
--- /dev/null
+++ b/public/emoji/2714_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34.459 1.375c-1.391-.902-3.248-.506-4.149.884L13.5 28.17l-8.198-7.58c-1.217-1.125-3.114-1.051-4.239.166-1.125 1.216-1.051 3.115.166 4.239l10.764 9.952s.309.266.452.359c.504.328 1.07.484 1.63.484.982 0 1.945-.482 2.52-1.368L35.343 5.524c.902-1.39.506-3.248-.884-4.149z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34.459 1.375c-1.391-.902-3.248-.506-4.149.884L13.5 28.17l-8.198-7.58c-1.217-1.125-3.114-1.051-4.239.166-1.125 1.216-1.051 3.115.166 4.239l10.764 9.952s.309.266.452.359c.504.328 1.07.484 1.63.484.982 0 1.945-.482 2.52-1.368L35.343 5.524c.902-1.39.506-3.248-.884-4.149z"/>
+</svg>
diff --git a/public/emoji/2716_border.svg b/public/emoji/2716_border.svg
new file mode 100644
index 000000000..d5701be65
--- /dev/null
+++ b/public/emoji/2716_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M22.238 18.004l9.883-9.883c1.172-1.171 1.172-3.071 0-4.243-1.172-1.171-3.07-1.171-4.242 0l-9.883 9.883-9.883-9.882c-1.171-1.172-3.071-1.172-4.243 0-1.171 1.171-1.171 3.071 0 4.243l9.883 9.882-9.907 9.907c-1.171 1.171-1.171 3.071 0 4.242.585.586 1.354.879 2.121.879s1.536-.293 2.122-.879l9.906-9.906 9.882 9.882c.586.586 1.354.879 2.121.879s1.535-.293 2.121-.879c1.172-1.171 1.172-3.071 0-4.242l-9.881-9.883z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M22.238 18.004l9.883-9.883c1.172-1.171 1.172-3.071 0-4.243-1.172-1.171-3.07-1.171-4.242 0l-9.883 9.883-9.883-9.882c-1.171-1.172-3.071-1.172-4.243 0-1.171 1.171-1.171 3.071 0 4.243l9.883 9.882-9.907 9.907c-1.171 1.171-1.171 3.071 0 4.242.585.586 1.354.879 2.121.879s1.536-.293 2.122-.879l9.906-9.906 9.882 9.882c.586.586 1.354.879 2.121.879s1.535-.293 2.121-.879c1.172-1.171 1.172-3.071 0-4.242l-9.881-9.883z"/>
+</svg>
diff --git a/public/emoji/2734_border.svg b/public/emoji/2734_border.svg
new file mode 100644
index 000000000..c74c6a511
--- /dev/null
+++ b/public/emoji/2734_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M13.574 11.235c1.335.971 2.631.43 2.882-1.201l1.088-7.069c.251-1.631.661-1.631.912 0l1.088 7.069c.251 1.631 1.548 2.171 2.882 1.201l6.148-4.471c1.334-.971 1.632-.673.661.662l-4.471 6.147c-.971 1.335-.431 2.631 1.2 2.882l7.07 1.088c1.631.251 1.631.661 0 .912l-7.07 1.088c-1.631.251-2.171 1.548-1.2 2.882l4.471 6.148c.971 1.334.673 1.632-.661.661l-6.148-4.471c-1.334-.971-2.631-.431-2.882 1.2l-1.088 7.07c-.251 1.631-.661 1.631-.912 0l-1.088-7.07c-.251-1.631-1.548-2.171-2.882-1.2l-6.147 4.471c-1.334.971-1.581.713-.546-.573l5.085-6.324c1.034-1.286.542-2.523-1.092-2.748l-8.057-1.113c-1.634-.226-1.638-.62-.008-.876l7.228-1.135c1.63-.256 2.17-1.558 1.199-2.892L6.765 7.426c-.971-1.334-.673-1.632.661-.661l6.148 4.47z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M13.574 11.235c1.335.971 2.631.43 2.882-1.201l1.088-7.069c.251-1.631.661-1.631.912 0l1.088 7.069c.251 1.631 1.548 2.171 2.882 1.201l6.148-4.471c1.334-.971 1.632-.673.661.662l-4.471 6.147c-.971 1.335-.431 2.631 1.2 2.882l7.07 1.088c1.631.251 1.631.661 0 .912l-7.07 1.088c-1.631.251-2.171 1.548-1.2 2.882l4.471 6.148c.971 1.334.673 1.632-.661.661l-6.148-4.471c-1.334-.971-2.631-.431-2.882 1.2l-1.088 7.07c-.251 1.631-.661 1.631-.912 0l-1.088-7.07c-.251-1.631-1.548-2.171-2.882-1.2l-6.147 4.471c-1.334.971-1.581.713-.546-.573l5.085-6.324c1.034-1.286.542-2.523-1.092-2.748l-8.057-1.113c-1.634-.226-1.638-.62-.008-.876l7.228-1.135c1.63-.256 2.17-1.558 1.199-2.892L6.765 7.426c-.971-1.334-.673-1.632.661-.661l6.148 4.47z"/>
+</svg>
diff --git a/public/emoji/2754_border.svg b/public/emoji/2754_border.svg
new file mode 100644
index 000000000..1d6c4ecda
--- /dev/null
+++ b/public/emoji/2754_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M17 27c-1.657 0-3-1.343-3-3v-4c0-1.657 1.343-3 3-3 .603-.006 6-1 6-5 0-2-2-4-5-4-2.441 0-4 2-4 3 0 1.657-1.343 3-3 3s-3-1.343-3-3c0-4.878 4.58-9 10-9 8 0 11 5.982 11 11 0 4.145-2.277 7.313-6.413 8.92-.9.351-1.79.587-2.587.747V24c0 1.657-1.343 3-3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="17" cy="32" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M17 27c-1.657 0-3-1.343-3-3v-4c0-1.657 1.343-3 3-3 .603-.006 6-1 6-5 0-2-2-4-5-4-2.441 0-4 2-4 3 0 1.657-1.343 3-3 3s-3-1.343-3-3c0-4.878 4.58-9 10-9 8 0 11 5.982 11 11 0 4.145-2.277 7.313-6.413 8.92-.9.351-1.79.587-2.587.747V24c0 1.657-1.343 3-3 3z"/>
+  <circle fill="#CCD6DD" cx="17" cy="32" r="3"/>
+</svg>
diff --git a/public/emoji/2755_border.svg b/public/emoji/2755_border.svg
new file mode 100644
index 000000000..65ec57082
--- /dev/null
+++ b/public/emoji/2755_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="32" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21 24c0 1.657-1.343 3-3 3s-3-1.343-3-3V5c0-1.657 1.343-3 3-3s3 1.343 3 3v19z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#CCD6DD" cx="18" cy="32" r="3"/>
+  <path fill="#CCD6DD" d="M21 24c0 1.657-1.343 3-3 3s-3-1.343-3-3V5c0-1.657 1.343-3 3-3s3 1.343 3 3v19z"/>
+</svg>
diff --git a/public/emoji/2795_border.svg b/public/emoji/2795_border.svg
new file mode 100644
index 000000000..14c2cf69b
--- /dev/null
+++ b/public/emoji/2795_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M31 15H21V5c0-1.657-1.343-3-3-3s-3 1.343-3 3v10H5c-1.657 0-3 1.343-3 3s1.343 3 3 3h10v10c0 1.657 1.343 3 3 3s3-1.343 3-3V21h10c1.657 0 3-1.343 3-3s-1.343-3-3-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M31 15H21V5c0-1.657-1.343-3-3-3s-3 1.343-3 3v10H5c-1.657 0-3 1.343-3 3s1.343 3 3 3h10v10c0 1.657 1.343 3 3 3s3-1.343 3-3V21h10c1.657 0 3-1.343 3-3s-1.343-3-3-3z"/>
+</svg>
diff --git a/public/emoji/2796_border.svg b/public/emoji/2796_border.svg
new file mode 100644
index 000000000..6ee64cae2
--- /dev/null
+++ b/public/emoji/2796_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z"/>
+</svg>
diff --git a/public/emoji/2797_border.svg b/public/emoji/2797_border.svg
new file mode 100644
index 000000000..0bbf13ba2
--- /dev/null
+++ b/public/emoji/2797_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="7" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="29" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z"/>
+  <circle fill="#31373D" cx="18" cy="7" r="4"/>
+  <circle fill="#31373D" cx="18" cy="29" r="4"/>
+</svg>
diff --git a/public/emoji/27b0_border.svg b/public/emoji/27b0_border.svg
new file mode 100644
index 000000000..dec79f5c6
--- /dev/null
+++ b/public/emoji/27b0_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M18 32.625c-5.09 0-10.5-3.965-10.5-11.312 0-4.877 3.365-9.178 7.591-12.272C12.393 7.739 9.756 7 8 7c-2.708 0-5.499.914-5.527.923-.79.258-1.635-.165-1.896-.951-.261-.785.163-1.633.949-1.895C1.658 5.033 4.793 4 8 4c2.695 0 6.449 1.158 10.01 3.162C21.565 5.158 25.31 4 28 4c3.207 0 6.222 1.559 6.344 1.625.781.422 1.312.699 1.125 1.266-.182.551-.891.328-1.75.234-.029-.003-2.156-.391-5.688-.391-1.752 0-4.41 1.003-7.1 2.304 4.215 3.083 7.568 7.36 7.568 12.212C28.5 28.639 23.09 32.625 18 32.625zm.013-21.954c-4.03 2.585-7.513 6.345-7.513 10.642 0 6.056 4.6 8.312 7.5 8.312 2.899 0 7.5-2.273 7.5-8.375 0-4.27-3.468-8.005-7.487-10.579z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M18 32.625c-5.09 0-10.5-3.965-10.5-11.312 0-4.877 3.365-9.178 7.591-12.272C12.393 7.739 9.756 7 8 7c-2.708 0-5.499.914-5.527.923-.79.258-1.635-.165-1.896-.951-.261-.785.163-1.633.949-1.895C1.658 5.033 4.793 4 8 4c2.695 0 6.449 1.158 10.01 3.162C21.565 5.158 25.31 4 28 4c3.207 0 6.222 1.559 6.344 1.625.781.422 1.312.699 1.125 1.266-.182.551-.891.328-1.75.234-.029-.003-2.156-.391-5.688-.391-1.752 0-4.41 1.003-7.1 2.304 4.215 3.083 7.568 7.36 7.568 12.212C28.5 28.639 23.09 32.625 18 32.625zm.013-21.954c-4.03 2.585-7.513 6.345-7.513 10.642 0 6.056 4.6 8.312 7.5 8.312 2.899 0 7.5-2.273 7.5-8.375 0-4.27-3.468-8.005-7.487-10.579z"/>
+</svg>
diff --git a/public/emoji/2b1b_border.svg b/public/emoji/2b1b_border.svg
new file mode 100644
index 000000000..b622c3510
--- /dev/null
+++ b/public/emoji/2b1b_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/>
+</svg>
diff --git a/public/emoji/2b1c_border.svg b/public/emoji/2b1c_border.svg
new file mode 100644
index 000000000..c633cc3de
--- /dev/null
+++ b/public/emoji/2b1c_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/>
+</svg>
diff --git a/public/emoji/3030_border.svg b/public/emoji/3030_border.svg
new file mode 100644
index 000000000..635214d15
--- /dev/null
+++ b/public/emoji/3030_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M27 23c-2.589 0-4.005-2.549-5.374-5.014C20.537 16.026 19.411 14 18 14c-1.412 0-2.537 2.026-3.626 3.986C13.004 20.451 11.588 23 9 23c-2.65 0-3.853-2.706-4.914-5.094C3.038 15.546 2.256 14 1 14c-.552 0-1-.448-1-1s.448-1 1-1c2.65 0 3.853 2.706 4.914 5.094C6.962 19.453 7.744 21 9 21c1.412 0 2.537-2.026 3.626-3.986C13.996 14.549 15.412 12 18 12c2.589 0 4.005 2.549 5.374 5.014C24.463 18.974 25.589 21 27 21c1.256 0 2.037-1.547 3.086-3.906C31.147 14.706 32.351 12 35 12c.553 0 1 .448 1 1s-.447 1-1 1c-1.256 0-2.037 1.546-3.086 3.906C30.853 20.294 29.649 23 27 23z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M27 23c-2.589 0-4.005-2.549-5.374-5.014C20.537 16.026 19.411 14 18 14c-1.412 0-2.537 2.026-3.626 3.986C13.004 20.451 11.588 23 9 23c-2.65 0-3.853-2.706-4.914-5.094C3.038 15.546 2.256 14 1 14c-.552 0-1-.448-1-1s.448-1 1-1c2.65 0 3.853 2.706 4.914 5.094C6.962 19.453 7.744 21 9 21c1.412 0 2.537-2.026 3.626-3.986C13.996 14.549 15.412 12 18 12c2.589 0 4.005 2.549 5.374 5.014C24.463 18.974 25.589 21 27 21c1.256 0 2.037-1.547 3.086-3.906C31.147 14.706 32.351 12 35 12c.553 0 1 .448 1 1s-.447 1-1 1c-1.256 0-2.037 1.546-3.086 3.906C30.853 20.294 29.649 23 27 23z"/>
+</svg>
diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb
index a5ed14180..d956e1b35 100644
--- a/spec/controllers/activitypub/replies_controller_spec.rb
+++ b/spec/controllers/activitypub/replies_controller_spec.rb
@@ -4,6 +4,7 @@ require 'rails_helper'
 
 RSpec.describe ActivityPub::RepliesController, type: :controller do
   let(:status) { Fabricate(:status, visibility: parent_visibility) }
+  let(:remote_reply_id) { nil }
   let(:remote_account) { nil }
 
   before do
@@ -14,6 +15,8 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
     Fabricate(:status, thread: status, visibility: :private)
     Fabricate(:status, account: status.account, thread: status, visibility: :public)
     Fabricate(:status, account: status.account, thread: status, visibility: :private)
+
+    Fabricate(:status, account: remote_account, thread: status, visibility: :public, uri: remote_reply_id) if remote_reply_id
   end
 
   describe 'GET #index' do
@@ -110,6 +113,20 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
               expect(json[:first][:items].size).to eq 2
               expect(json[:first][:items].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
             end
+
+            context 'with remote responses' do
+              let(:remote_reply_id) { 'foo' }
+
+              it 'returned items are all inlined local toots or are ids' do
+                json = body_as_json
+
+                expect(json[:first]).to be_a Hash
+                expect(json[:first][:items]).to be_an Array
+                expect(json[:first][:items].size).to eq 3
+                expect(json[:first][:items].all? { |item| item.is_a?(Hash) ? ActivityPub::TagManager.instance.local_uri?(item[:id]) : item.is_a?(String) }).to be true
+                expect(json[:first][:items]).to include remote_reply_id
+              end
+            end
           end
         end
 
diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb
index 1950c173a..c387842cd 100644
--- a/spec/controllers/auth/sessions_controller_spec.rb
+++ b/spec/controllers/auth/sessions_controller_spec.rb
@@ -215,7 +215,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
 
       context 'using a valid OTP' do
         before do
-          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id }
         end
 
         it 'redirects to home' do
@@ -230,7 +230,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
       context 'when the server has an decryption error' do
         before do
           allow_any_instance_of(User).to receive(:validate_and_consume_otp!).and_raise(OpenSSL::Cipher::CipherError)
-          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id }
         end
 
         it 'shows a login error' do
@@ -244,7 +244,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
 
       context 'using a valid recovery code' do
         before do
-          post :create, params: { user: { otp_attempt: recovery_codes.first } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: recovery_codes.first } }, session: { attempt_user_id: user.id }
         end
 
         it 'redirects to home' do
@@ -258,7 +258,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
 
       context 'using an invalid OTP' do
         before do
-          post :create, params: { user: { otp_attempt: 'wrongotp' } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id }
         end
 
         it 'shows a login error' do
@@ -270,5 +270,63 @@ RSpec.describe Auth::SessionsController, type: :controller do
         end
       end
     end
+
+    context 'when 2FA is disabled and IP is unfamiliar' do
+      let!(:user) { Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', current_sign_in_at: 3.weeks.ago, current_sign_in_ip: '0.0.0.0') }
+
+      before do
+        request.remote_ip  = '10.10.10.10'
+        request.user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0'
+
+        allow(UserMailer).to receive(:sign_in_token).and_return(double('email', deliver_later!: nil))
+      end
+
+      context 'using email and password' do
+        before do
+          post :create, params: { user: { email: user.email, password: user.password } }
+        end
+
+        it 'renders sign in token authentication page' do
+          expect(controller).to render_template("sign_in_token")
+        end
+
+        it 'generates sign in token' do
+          expect(user.reload.sign_in_token).to_not be_nil
+        end
+
+        it 'sends sign in token e-mail' do
+          expect(UserMailer).to have_received(:sign_in_token)
+        end
+      end
+
+      context 'using a valid sign in token' do
+        before do
+          user.generate_sign_in_token && user.save
+          post :create, params: { user: { sign_in_token_attempt: user.sign_in_token } }, session: { attempt_user_id: user.id }
+        end
+
+        it 'redirects to home' do
+          expect(response).to redirect_to(root_path)
+        end
+
+        it 'logs the user in' do
+          expect(controller.current_user).to eq user
+        end
+      end
+
+      context 'using an invalid sign in token' do
+        before do
+          post :create, params: { user: { sign_in_token_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id }
+        end
+
+        it 'shows a login error' do
+          expect(flash[:alert]).to match I18n.t('users.invalid_sign_in_token')
+        end
+
+        it "doesn't log the user in" do
+          expect(controller.current_user).to be_nil
+        end
+      end
+    end
   end
 end
diff --git a/spec/fabricators/device_fabricator.rb b/spec/fabricators/device_fabricator.rb
new file mode 100644
index 000000000..b15d8248f
--- /dev/null
+++ b/spec/fabricators/device_fabricator.rb
@@ -0,0 +1,8 @@
+Fabricator(:device) do
+  access_token
+  account
+  device_id        { Faker::Number.number(digits: 5) }
+  name             { Faker::App.name }
+  fingerprint_key  { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
+  identity_key     { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
+end
diff --git a/spec/fabricators/encrypted_message_fabricator.rb b/spec/fabricators/encrypted_message_fabricator.rb
new file mode 100644
index 000000000..e65f66302
--- /dev/null
+++ b/spec/fabricators/encrypted_message_fabricator.rb
@@ -0,0 +1,8 @@
+Fabricator(:encrypted_message) do
+  device
+  from_account
+  from_device_id   { Faker::Number.number(digits: 5) }
+  type             0
+  body             ""
+  message_franking ""
+end
diff --git a/spec/fabricators/one_time_key_fabricator.rb b/spec/fabricators/one_time_key_fabricator.rb
new file mode 100644
index 000000000..8794baeb5
--- /dev/null
+++ b/spec/fabricators/one_time_key_fabricator.rb
@@ -0,0 +1,11 @@
+Fabricator(:one_time_key) do
+  device
+  key_id { Faker::Alphanumeric.alphanumeric(number: 10) }
+  key    { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
+
+  signature do |attrs|
+    signing_key = Ed25519::SigningKey.generate
+    attrs[:device].update(fingerprint_key: Base64.strict_encode64(signing_key.verify_key.to_bytes))
+    Base64.strict_encode64(signing_key.sign(attrs[:key]))
+  end
+end
diff --git a/spec/fabricators/system_key_fabricator.rb b/spec/fabricators/system_key_fabricator.rb
new file mode 100644
index 000000000..f808495e0
--- /dev/null
+++ b/spec/fabricators/system_key_fabricator.rb
@@ -0,0 +1,3 @@
+Fabricator(:system_key) do
+
+end
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index 5220deabb..2ac4acc12 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -579,6 +579,62 @@ RSpec.describe ActivityPub::Activity::Create do
       end
     end
 
+    context 'with an encrypted message' do
+      let(:recipient) { Fabricate(:account) }
+      let(:target_device) { Fabricate(:device, account: recipient) }
+
+      subject { described_class.new(json, sender, delivery: true, delivered_to_account_id: recipient.id) }
+
+      let(:object_json) do
+        {
+          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+          type: 'EncryptedMessage',
+          attributedTo: {
+            type: 'Device',
+            deviceId: '1234',
+          },
+          to: {
+            type: 'Device',
+            deviceId: target_device.device_id,
+          },
+          messageType: 1,
+          cipherText: 'Foo',
+          messageFranking: 'Baz678',
+          digest: {
+            digestAlgorithm: 'Bar456',
+            digestValue: 'Foo123',
+          },
+        }
+      end
+
+      before do
+        subject.perform
+      end
+
+      it 'creates an encrypted message' do
+        encrypted_message = target_device.encrypted_messages.reload.first
+
+        expect(encrypted_message).to_not be_nil
+        expect(encrypted_message.from_device_id).to eq '1234'
+        expect(encrypted_message.from_account).to eq sender
+        expect(encrypted_message.type).to eq 1
+        expect(encrypted_message.body).to eq 'Foo'
+        expect(encrypted_message.digest).to eq 'Foo123'
+      end
+
+      it 'creates a message franking' do
+        encrypted_message = target_device.encrypted_messages.reload.first
+        message_franking  = encrypted_message.message_franking
+
+        crypt = ActiveSupport::MessageEncryptor.new(SystemKey.current_key, serializer: Oj)
+        json  = crypt.decrypt_and_verify(message_franking)
+
+        expect(json['source_account_id']).to eq sender.id
+        expect(json['target_account_id']).to eq recipient.id
+        expect(json['original_franking']).to eq 'Baz678'
+      end
+    end
+
     context 'when sender is followed by local users' do
       subject { described_class.new(json, sender, delivery: true) }
 
diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb
index 464f177d0..313666412 100644
--- a/spec/mailers/previews/user_mailer_preview.rb
+++ b/spec/mailers/previews/user_mailer_preview.rb
@@ -59,4 +59,9 @@ class UserMailerPreview < ActionMailer::Preview
   def warning
     UserMailer.warning(User.first, AccountWarning.new(text: '', action: :silence), [Status.first.id])
   end
+
+  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/sign_in_token
+  def sign_in_token
+    UserMailer.sign_in_token(User.first.tap { |user| user.generate_sign_in_token }, '127.0.0.1', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0', Time.now.utc)
+  end
 end
diff --git a/spec/models/device_spec.rb b/spec/models/device_spec.rb
new file mode 100644
index 000000000..f56fbf978
--- /dev/null
+++ b/spec/models/device_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Device, type: :model do
+
+end
diff --git a/spec/models/encrypted_message_spec.rb b/spec/models/encrypted_message_spec.rb
new file mode 100644
index 000000000..1238d57b6
--- /dev/null
+++ b/spec/models/encrypted_message_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe EncryptedMessage, type: :model do
+
+end
diff --git a/spec/models/one_time_key_spec.rb b/spec/models/one_time_key_spec.rb
new file mode 100644
index 000000000..34598334c
--- /dev/null
+++ b/spec/models/one_time_key_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe OneTimeKey, type: :model do
+
+end
diff --git a/spec/models/system_key_spec.rb b/spec/models/system_key_spec.rb
new file mode 100644
index 000000000..a138bc131
--- /dev/null
+++ b/spec/models/system_key_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe SystemKey, type: :model do
+
+end
diff --git a/spec/services/clear_domain_media_service_spec.rb b/spec/services/clear_domain_media_service_spec.rb
new file mode 100644
index 000000000..8e58c6039
--- /dev/null
+++ b/spec/services/clear_domain_media_service_spec.rb
@@ -0,0 +1,23 @@
+require 'rails_helper'
+
+RSpec.describe ClearDomainMediaService, type: :service do
+  let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') }
+  let!(:bad_status1) { Fabricate(:status, account: bad_account, text: 'You suck') }
+  let!(:bad_status2) { Fabricate(:status, account: bad_account, text: 'Hahaha') }
+  let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status2, file: attachment_fixture('attachment.jpg')) }
+
+  subject { ClearDomainMediaService.new }
+
+  describe 'for a silence with reject media' do
+    before do
+      subject.call(DomainBlock.create!(domain: 'evil.org', severity: :silence, reject_media: true))
+    end
+
+    it 'leaves the domains status and attachements, but clears media' do
+      expect { bad_status1.reload }.not_to raise_error
+      expect { bad_status2.reload }.not_to raise_error
+      expect { bad_attachment.reload }.not_to raise_error
+      expect(bad_attachment.file.exists?).to be false
+    end
+  end
+end
diff --git a/spec/workers/domain_block_worker_spec.rb b/spec/workers/domain_block_worker_spec.rb
index 48b3e38c4..bd8fc4a62 100644
--- a/spec/workers/domain_block_worker_spec.rb
+++ b/spec/workers/domain_block_worker_spec.rb
@@ -8,7 +8,7 @@ describe DomainBlockWorker do
   describe 'perform' do
     let(:domain_block) { Fabricate(:domain_block) }
 
-    it 'returns true for non-existent domain block' do
+    it 'calls domain block service for relevant domain block' do
       service = double(call: nil)
       allow(BlockDomainService).to receive(:new).and_return(service)
       result = subject.perform(domain_block.id)
@@ -17,7 +17,7 @@ describe DomainBlockWorker do
       expect(service).to have_received(:call).with(domain_block, false)
     end
 
-    it 'calls domain block service for relevant domain block' do
+    it 'returns true for non-existent domain block' do
       result = subject.perform('aaa')
 
       expect(result).to eq(true)
diff --git a/spec/workers/domain_clear_media_worker_spec.rb b/spec/workers/domain_clear_media_worker_spec.rb
new file mode 100644
index 000000000..36251b1ec
--- /dev/null
+++ b/spec/workers/domain_clear_media_worker_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe DomainClearMediaWorker do
+  subject { described_class.new }
+
+  describe 'perform' do
+    let(:domain_block) { Fabricate(:domain_block, severity: :silence, reject_media: true) }
+
+    it 'calls domain clear media service for relevant domain block' do
+      service = double(call: nil)
+      allow(ClearDomainMediaService).to receive(:new).and_return(service)
+      result = subject.perform(domain_block.id)
+
+      expect(result).to be_nil
+      expect(service).to have_received(:call).with(domain_block)
+    end
+
+    it 'returns true for non-existent domain block' do
+      result = subject.perform('aaa')
+
+      expect(result).to eq(true)
+    end
+  end
+end
diff --git a/streaming/index.js b/streaming/index.js
index b70339c30..f1d0ed5c0 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -144,13 +144,21 @@ const startWorker = (workerId) => {
     callbacks.forEach(callback => callback(message));
   });
 
-  const subscriptionHeartbeat = (channel) => {
-    const interval = 6*60;
+  const subscriptionHeartbeat = channels => {
+    if (!Array.isArray(channels)) {
+      channels = [channels];
+    }
+
+    const interval = 6 * 60;
+
     const tellSubscribed = () => {
-      redisClient.set(`${redisPrefix}subscribed:${channel}`, '1', 'EX', interval*3);
+      channels.forEach(channel => redisClient.set(`${redisPrefix}subscribed:${channel}`, '1', 'EX', interval * 3));
     };
+
     tellSubscribed();
-    const heartbeat = setInterval(tellSubscribed, interval*1000);
+
+    const heartbeat = setInterval(tellSubscribed, interval * 1000);
+
     return () => {
       clearInterval(heartbeat);
     };
@@ -203,7 +211,7 @@ const startWorker = (workerId) => {
         return;
       }
 
-      client.query('SELECT oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', [token], (err, result) => {
+      client.query('SELECT oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes, devices.device_id FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id LEFT OUTER JOIN devices ON oauth_access_tokens.id = devices.access_token_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', [token], (err, result) => {
         done();
 
         if (err) {
@@ -232,6 +240,7 @@ const startWorker = (workerId) => {
         req.accountId = result.rows[0].account_id;
         req.chosenLanguages = result.rows[0].chosen_languages;
         req.allowNotifications = scopes.some(scope => ['read', 'read:notifications'].includes(scope));
+        req.deviceId = result.rows[0].device_id;
 
         next();
       });
@@ -353,11 +362,15 @@ const startWorker = (workerId) => {
     });
   };
 
-  const streamFrom = (id, req, output, attachCloseHandler, needsFiltering = false, notificationOnly = false) => {
-    const accountId = req.accountId || req.remoteAddress;
-
+  const streamFrom = (ids, req, output, attachCloseHandler, needsFiltering = false, notificationOnly = false) => {
+    const accountId  = req.accountId || req.remoteAddress;
     const streamType = notificationOnly ? ' (notification)' : '';
-    log.verbose(req.requestId, `Starting stream from ${id} for ${accountId}${streamType}`);
+
+    if (!Array.isArray(ids)) {
+      ids = [ids];
+    }
+
+    log.verbose(req.requestId, `Starting stream from ${ids.join(', ')} for ${accountId}${streamType}`);
 
     const listener = message => {
       const { event, payload, queued_at } = JSON.parse(message);
@@ -436,8 +449,11 @@ const startWorker = (workerId) => {
       });
     };
 
-    subscribe(`${redisPrefix}${id}`, listener);
-    attachCloseHandler(`${redisPrefix}${id}`, listener);
+    ids.forEach(id => {
+      subscribe(`${redisPrefix}${id}`, listener);
+    });
+
+    attachCloseHandler(ids.map(id => `${redisPrefix}${id}`), listener);
   };
 
   // Setup stream output to HTTP
@@ -464,9 +480,16 @@ const startWorker = (workerId) => {
   };
 
   // Setup stream end for HTTP
-  const streamHttpEnd = (req, closeHandler = false) => (id, listener) => {
+  const streamHttpEnd = (req, closeHandler = false) => (ids, listener) => {
+    if (!Array.isArray(ids)) {
+      ids = [ids];
+    }
+
     req.on('close', () => {
-      unsubscribe(id, listener);
+      ids.forEach(id => {
+        unsubscribe(id, listener);
+      });
+
       if (closeHandler) {
         closeHandler();
       }
@@ -522,8 +545,13 @@ const startWorker = (workerId) => {
   app.use(errorMiddleware);
 
   app.get('/api/v1/streaming/user', (req, res) => {
-    const channel = `timeline:${req.accountId}`;
-    streamFrom(channel, req, streamToHttp(req, res), streamHttpEnd(req, subscriptionHeartbeat(channel)));
+    const channels = [`timeline:${req.accountId}`];
+
+    if (req.deviceId) {
+      channels.push(`timeline:${req.accountId}:${req.deviceId}`);
+    }
+
+    streamFrom(channels, req, streamToHttp(req, res), streamHttpEnd(req, subscriptionHeartbeat(channels)));
   });
 
   app.get('/api/v1/streaming/user/notification', (req, res) => {
@@ -603,7 +631,12 @@ const startWorker = (workerId) => {
 
     switch(location.query.stream) {
     case 'user':
-      channel = `timeline:${req.accountId}`;
+      channel = [`timeline:${req.accountId}`];
+
+      if (req.deviceId) {
+        channel.push(`timeline:${req.accountId}:${req.deviceId}`);
+      }
+
       streamFrom(channel, req, streamToWs(req, ws), streamWsEnd(req, ws, subscriptionHeartbeat(channel)));
       break;
     case 'user:notification':
diff --git a/yarn.lock b/yarn.lock
index 08dfacf7a..d08113ec8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,35 +2,35 @@
 # yarn lockfile v1
 
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
-  integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff"
+  integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
   dependencies:
-    "@babel/highlight" "^7.8.3"
+    "@babel/highlight" "^7.10.1"
 
-"@babel/compat-data@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b"
-  integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==
+"@babel/compat-data@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db"
+  integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==
   dependencies:
-    browserslist "^4.11.1"
+    browserslist "^4.12.0"
     invariant "^2.2.4"
     semver "^5.5.0"
 
-"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376"
-  integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/generator" "^7.9.6"
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helpers" "^7.9.6"
-    "@babel/parser" "^7.9.6"
-    "@babel/template" "^7.8.6"
-    "@babel/traverse" "^7.9.6"
-    "@babel/types" "^7.9.6"
+"@babel/core@^7.1.0", "@babel/core@^7.10.2", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a"
+  integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.1"
+    "@babel/generator" "^7.10.2"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helpers" "^7.10.1"
+    "@babel/parser" "^7.10.2"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.2"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.1"
@@ -40,16 +40,23 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43"
-  integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==
+"@babel/generator@^7.10.1", "@babel/generator@^7.10.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9"
+  integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==
   dependencies:
-    "@babel/types" "^7.9.6"
+    "@babel/types" "^7.10.2"
     jsesc "^2.5.1"
     lodash "^4.17.13"
     source-map "^0.5.0"
 
+"@babel/helper-annotate-as-pure@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268"
+  integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==
+  dependencies:
+    "@babel/types" "^7.10.1"
+
 "@babel/helper-annotate-as-pure@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
@@ -57,22 +64,30 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503"
-  integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059"
+  integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-explode-assignable-expression" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-builder-react-jsx-experimental@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43"
-  integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==
+"@babel/helper-builder-react-jsx-experimental@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8"
+  integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/types" "^7.9.0"
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/types" "^7.10.1"
+
+"@babel/helper-builder-react-jsx@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532"
+  integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-builder-react-jsx@^7.9.0":
   version "7.9.0"
@@ -82,17 +97,29 @@
     "@babel/helper-annotate-as-pure" "^7.8.3"
     "@babel/types" "^7.9.0"
 
-"@babel/helper-compilation-targets@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a"
-  integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==
+"@babel/helper-compilation-targets@^7.10.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285"
+  integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==
   dependencies:
-    "@babel/compat-data" "^7.9.6"
-    browserslist "^4.11.1"
+    "@babel/compat-data" "^7.10.1"
+    browserslist "^4.12.0"
     invariant "^2.2.4"
     levenary "^1.1.1"
     semver "^5.5.0"
 
+"@babel/helper-create-class-features-plugin@^7.10.1":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67"
+  integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==
+  dependencies:
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-member-expression-to-functions" "^7.10.1"
+    "@babel/helper-optimise-call-expression" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
+
 "@babel/helper-create-class-features-plugin@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397"
@@ -105,6 +132,15 @@
     "@babel/helper-replace-supers" "^7.8.3"
     "@babel/helper-split-export-declaration" "^7.8.3"
 
+"@babel/helper-create-regexp-features-plugin@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd"
+  integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-regex" "^7.10.1"
+    regexpu-core "^4.7.0"
+
 "@babel/helper-create-regexp-features-plugin@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79"
@@ -113,31 +149,31 @@
     "@babel/helper-regex" "^7.8.3"
     regexpu-core "^4.6.0"
 
-"@babel/helper-create-regexp-features-plugin@^7.8.8":
-  version "7.8.8"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087"
-  integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==
+"@babel/helper-define-map@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d"
+  integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-regex" "^7.8.3"
-    regexpu-core "^4.7.0"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/types" "^7.10.1"
+    lodash "^4.17.13"
 
-"@babel/helper-define-map@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
-  integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==
+"@babel/helper-explode-assignable-expression@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e"
+  integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==
   dependencies:
-    "@babel/helper-function-name" "^7.8.3"
-    "@babel/types" "^7.8.3"
-    lodash "^4.17.13"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-explode-assignable-expression@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982"
-  integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==
+"@babel/helper-function-name@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4"
+  integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==
   dependencies:
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-function-name@^7.8.3":
   version "7.8.3"
@@ -148,14 +184,12 @@
     "@babel/template" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-function-name@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
-  integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
+"@babel/helper-get-function-arity@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d"
+  integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/types" "^7.9.5"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-get-function-arity@^7.8.3":
   version "7.8.3"
@@ -164,12 +198,19 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-hoist-variables@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134"
-  integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==
+"@babel/helper-hoist-variables@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077"
+  integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
+
+"@babel/helper-member-expression-to-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15"
+  integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==
+  dependencies:
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-member-expression-to-functions@^7.8.3":
   version "7.8.3"
@@ -178,26 +219,33 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
-  integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876"
+  integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-module-transforms@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
-  integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
+"@babel/helper-module-transforms@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622"
+  integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==
   dependencies:
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-replace-supers" "^7.8.6"
-    "@babel/helper-simple-access" "^7.8.3"
-    "@babel/helper-split-export-declaration" "^7.8.3"
-    "@babel/template" "^7.8.6"
-    "@babel/types" "^7.9.0"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-simple-access" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/types" "^7.10.1"
     lodash "^4.17.13"
 
+"@babel/helper-optimise-call-expression@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543"
+  integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==
+  dependencies:
+    "@babel/types" "^7.10.1"
+
 "@babel/helper-optimise-call-expression@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
@@ -205,10 +253,17 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
-  integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127"
+  integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==
+
+"@babel/helper-regex@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96"
+  integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==
+  dependencies:
+    lodash "^4.17.13"
 
 "@babel/helper-regex@^7.8.3":
   version "7.8.3"
@@ -217,16 +272,26 @@
   dependencies:
     lodash "^4.17.13"
 
-"@babel/helper-remap-async-to-generator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86"
-  integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==
+"@babel/helper-remap-async-to-generator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432"
+  integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-wrap-function" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-wrap-function" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
+
+"@babel/helper-replace-supers@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d"
+  integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.10.1"
+    "@babel/helper-optimise-call-expression" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-replace-supers@^7.8.3":
   version "7.8.3"
@@ -238,23 +303,20 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-replace-supers@^7.8.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444"
-  integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==
+"@babel/helper-simple-access@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e"
+  integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==
   dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.8.3"
-    "@babel/helper-optimise-call-expression" "^7.8.3"
-    "@babel/traverse" "^7.9.6"
-    "@babel/types" "^7.9.6"
+    "@babel/template" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-simple-access@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
-  integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
+"@babel/helper-split-export-declaration@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f"
+  integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==
   dependencies:
-    "@babel/template" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-split-export-declaration@^7.8.3":
   version "7.8.3"
@@ -263,60 +325,60 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
-  integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
+"@babel/helper-validator-identifier@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5"
+  integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==
 
-"@babel/helper-wrap-function@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
-  integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==
+"@babel/helper-wrap-function@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9"
+  integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==
   dependencies:
-    "@babel/helper-function-name" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helpers@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580"
-  integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==
+"@babel/helpers@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973"
+  integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==
   dependencies:
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.9.6"
-    "@babel/types" "^7.9.6"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/highlight@^7.8.3":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
-  integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
+"@babel/highlight@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0"
+  integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.9.0"
+    "@babel/helper-validator-identifier" "^7.10.1"
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7"
-  integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==
+"@babel/parser@^7.1.0", "@babel/parser@^7.10.1", "@babel/parser@^7.10.2", "@babel/parser@^7.7.0":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0"
+  integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==
 
-"@babel/plugin-proposal-async-generator-functions@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
-  integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
+"@babel/plugin-proposal-async-generator-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55"
+  integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-remap-async-to-generator" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-remap-async-to-generator" "^7.10.1"
     "@babel/plugin-syntax-async-generators" "^7.8.0"
 
-"@babel/plugin-proposal-class-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
-  integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
+"@babel/plugin-proposal-class-properties@^7.10.1", "@babel/plugin-proposal-class-properties@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01"
+  integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-create-class-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-proposal-decorators@^7.8.3":
   version "7.8.3"
@@ -327,70 +389,78 @@
     "@babel/helper-plugin-utils" "^7.8.3"
     "@babel/plugin-syntax-decorators" "^7.8.3"
 
-"@babel/plugin-proposal-dynamic-import@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
-  integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
+"@babel/plugin-proposal-dynamic-import@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0"
+  integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-dynamic-import" "^7.8.0"
 
-"@babel/plugin-proposal-json-strings@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
-  integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
+"@babel/plugin-proposal-json-strings@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09"
+  integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-json-strings" "^7.8.0"
 
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
-  integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78"
+  integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
 
-"@babel/plugin-proposal-numeric-separator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8"
-  integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==
+"@babel/plugin-proposal-numeric-separator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123"
+  integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.1"
 
-"@babel/plugin-proposal-object-rest-spread@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63"
-  integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==
+"@babel/plugin-proposal-object-rest-spread@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6"
+  integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
-    "@babel/plugin-transform-parameters" "^7.9.5"
+    "@babel/plugin-transform-parameters" "^7.10.1"
 
-"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
-  integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
+"@babel/plugin-proposal-optional-catch-binding@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2"
+  integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
 
-"@babel/plugin-proposal-optional-chaining@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
-  integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==
+"@babel/plugin-proposal-optional-chaining@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c"
+  integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-optional-chaining" "^7.8.0"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3":
-  version "7.8.8"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d"
-  integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==
+"@babel/plugin-proposal-private-methods@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598"
+  integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.8"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-create-class-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f"
+  integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4":
   version "7.8.4"
@@ -406,12 +476,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-class-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7"
-  integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==
+"@babel/plugin-syntax-class-properties@^7.10.1", "@babel/plugin-syntax-class-properties@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5"
+  integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-decorators@^7.8.3":
   version "7.8.3"
@@ -434,19 +504,19 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-jsx@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
-  integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==
+"@babel/plugin-syntax-jsx@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da"
+  integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897"
-  integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550"
+  integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
   version "7.8.3"
@@ -455,12 +525,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f"
-  integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==
+"@babel/plugin-syntax-numeric-separator@^7.10.1", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99"
+  integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
   version "7.8.3"
@@ -483,160 +553,160 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-top-level-await@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
-  integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
+"@babel/plugin-syntax-top-level-await@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362"
+  integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-arrow-functions@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
-  integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
+"@babel/plugin-transform-arrow-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b"
+  integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-async-to-generator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
-  integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
+"@babel/plugin-transform-async-to-generator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062"
+  integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==
   dependencies:
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-remap-async-to-generator" "^7.8.3"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-remap-async-to-generator" "^7.10.1"
 
-"@babel/plugin-transform-block-scoped-functions@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
-  integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
+"@babel/plugin-transform-block-scoped-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d"
+  integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-block-scoping@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
-  integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
+"@babel/plugin-transform-block-scoping@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e"
+  integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     lodash "^4.17.13"
 
-"@babel/plugin-transform-classes@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c"
-  integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-define-map" "^7.8.3"
-    "@babel/helper-function-name" "^7.9.5"
-    "@babel/helper-optimise-call-expression" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-replace-supers" "^7.8.6"
-    "@babel/helper-split-export-declaration" "^7.8.3"
+"@babel/plugin-transform-classes@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f"
+  integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-define-map" "^7.10.1"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-optimise-call-expression" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
-  integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
+"@babel/plugin-transform-computed-properties@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07"
+  integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-destructuring@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50"
-  integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==
+"@babel/plugin-transform-destructuring@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907"
+  integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
-  integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
+"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee"
+  integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-duplicate-keys@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
-  integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
+"@babel/plugin-transform-duplicate-keys@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9"
+  integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-exponentiation-operator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
-  integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
+"@babel/plugin-transform-exponentiation-operator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3"
+  integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-for-of@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e"
-  integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==
+"@babel/plugin-transform-for-of@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5"
+  integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-function-name@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
-  integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
+"@babel/plugin-transform-function-name@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d"
+  integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==
   dependencies:
-    "@babel/helper-function-name" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
-  integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
+"@babel/plugin-transform-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a"
+  integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-member-expression-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
-  integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
+"@babel/plugin-transform-member-expression-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39"
+  integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-modules-amd@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e"
-  integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==
+"@babel/plugin-transform-modules-amd@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a"
+  integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==
   dependencies:
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277"
-  integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==
+"@babel/plugin-transform-modules-commonjs@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301"
+  integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==
   dependencies:
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-simple-access" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-simple-access" "^7.10.1"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-systemjs@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4"
-  integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==
+"@babel/plugin-transform-modules-systemjs@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6"
+  integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.8.3"
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-hoist-variables" "^7.10.1"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-umd@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697"
-  integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==
+"@babel/plugin-transform-modules-umd@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595"
+  integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
   version "7.8.3"
@@ -645,42 +715,42 @@
   dependencies:
     "@babel/helper-create-regexp-features-plugin" "^7.8.3"
 
-"@babel/plugin-transform-new-target@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
-  integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
+"@babel/plugin-transform-new-target@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324"
+  integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-object-super@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
-  integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
+"@babel/plugin-transform-object-super@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde"
+  integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-replace-supers" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
 
-"@babel/plugin-transform-parameters@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795"
-  integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==
+"@babel/plugin-transform-parameters@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd"
+  integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-property-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
-  integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
+"@babel/plugin-transform-property-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d"
+  integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-react-display-name@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
-  integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
+"@babel/plugin-transform-react-display-name@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef"
+  integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-transform-react-inline-elements@^7.9.0":
   version "7.9.0"
@@ -690,171 +760,190 @@
     "@babel/helper-builder-react-jsx" "^7.9.0"
     "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-react-jsx-development@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754"
-  integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==
+"@babel/plugin-transform-react-jsx-development@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3"
+  integrity sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg==
   dependencies:
-    "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-builder-react-jsx-experimental" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx-self@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b"
-  integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==
+"@babel/plugin-transform-react-jsx-self@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821"
+  integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx-source@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0"
-  integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==
+"@babel/plugin-transform-react-jsx-source@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273"
+  integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx@^7.9.4":
-  version "7.9.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f"
-  integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==
+"@babel/plugin-transform-react-jsx@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz#91f544248ba131486decb5d9806da6a6e19a2896"
+  integrity sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.9.0"
-    "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-builder-react-jsx" "^7.10.1"
+    "@babel/helper-builder-react-jsx-experimental" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-regenerator@^7.8.7":
-  version "7.8.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8"
-  integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==
+"@babel/plugin-transform-react-pure-annotations@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz#f5e7c755d3e7614d4c926e144f501648a5277b70"
+  integrity sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-regenerator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490"
+  integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==
   dependencies:
     regenerator-transform "^0.14.2"
 
-"@babel/plugin-transform-reserved-words@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
-  integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
+"@babel/plugin-transform-reserved-words@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86"
+  integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-runtime@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b"
-  integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==
+"@babel/plugin-transform-runtime@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1"
+  integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==
   dependencies:
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
     resolve "^1.8.1"
     semver "^5.5.1"
 
-"@babel/plugin-transform-shorthand-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
-  integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-spread@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
-  integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-sticky-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
-  integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-regex" "^7.8.3"
-
-"@babel/plugin-transform-template-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
-  integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-typeof-symbol@^7.8.4":
-  version "7.8.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
-  integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-unicode-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
-  integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/preset-env@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6"
-  integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==
-  dependencies:
-    "@babel/compat-data" "^7.9.6"
-    "@babel/helper-compilation-targets" "^7.9.6"
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
-    "@babel/plugin-proposal-dynamic-import" "^7.8.3"
-    "@babel/plugin-proposal-json-strings" "^7.8.3"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
-    "@babel/plugin-proposal-numeric-separator" "^7.8.3"
-    "@babel/plugin-proposal-object-rest-spread" "^7.9.6"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
-    "@babel/plugin-proposal-optional-chaining" "^7.9.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
+"@babel/plugin-transform-shorthand-properties@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3"
+  integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-spread@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8"
+  integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-sticky-regex@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00"
+  integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-regex" "^7.10.1"
+
+"@babel/plugin-transform-template-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628"
+  integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-typeof-symbol@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e"
+  integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-unicode-escapes@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940"
+  integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-unicode-regex@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f"
+  integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/preset-env@^7.10.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb"
+  integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==
+  dependencies:
+    "@babel/compat-data" "^7.10.1"
+    "@babel/helper-compilation-targets" "^7.10.2"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-proposal-async-generator-functions" "^7.10.1"
+    "@babel/plugin-proposal-class-properties" "^7.10.1"
+    "@babel/plugin-proposal-dynamic-import" "^7.10.1"
+    "@babel/plugin-proposal-json-strings" "^7.10.1"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1"
+    "@babel/plugin-proposal-numeric-separator" "^7.10.1"
+    "@babel/plugin-proposal-object-rest-spread" "^7.10.1"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.10.1"
+    "@babel/plugin-proposal-optional-chaining" "^7.10.1"
+    "@babel/plugin-proposal-private-methods" "^7.10.1"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.10.1"
     "@babel/plugin-syntax-async-generators" "^7.8.0"
+    "@babel/plugin-syntax-class-properties" "^7.10.1"
     "@babel/plugin-syntax-dynamic-import" "^7.8.0"
     "@babel/plugin-syntax-json-strings" "^7.8.0"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-    "@babel/plugin-syntax-numeric-separator" "^7.8.0"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.1"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
     "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-    "@babel/plugin-syntax-top-level-await" "^7.8.3"
-    "@babel/plugin-transform-arrow-functions" "^7.8.3"
-    "@babel/plugin-transform-async-to-generator" "^7.8.3"
-    "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
-    "@babel/plugin-transform-block-scoping" "^7.8.3"
-    "@babel/plugin-transform-classes" "^7.9.5"
-    "@babel/plugin-transform-computed-properties" "^7.8.3"
-    "@babel/plugin-transform-destructuring" "^7.9.5"
-    "@babel/plugin-transform-dotall-regex" "^7.8.3"
-    "@babel/plugin-transform-duplicate-keys" "^7.8.3"
-    "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
-    "@babel/plugin-transform-for-of" "^7.9.0"
-    "@babel/plugin-transform-function-name" "^7.8.3"
-    "@babel/plugin-transform-literals" "^7.8.3"
-    "@babel/plugin-transform-member-expression-literals" "^7.8.3"
-    "@babel/plugin-transform-modules-amd" "^7.9.6"
-    "@babel/plugin-transform-modules-commonjs" "^7.9.6"
-    "@babel/plugin-transform-modules-systemjs" "^7.9.6"
-    "@babel/plugin-transform-modules-umd" "^7.9.0"
+    "@babel/plugin-syntax-top-level-await" "^7.10.1"
+    "@babel/plugin-transform-arrow-functions" "^7.10.1"
+    "@babel/plugin-transform-async-to-generator" "^7.10.1"
+    "@babel/plugin-transform-block-scoped-functions" "^7.10.1"
+    "@babel/plugin-transform-block-scoping" "^7.10.1"
+    "@babel/plugin-transform-classes" "^7.10.1"
+    "@babel/plugin-transform-computed-properties" "^7.10.1"
+    "@babel/plugin-transform-destructuring" "^7.10.1"
+    "@babel/plugin-transform-dotall-regex" "^7.10.1"
+    "@babel/plugin-transform-duplicate-keys" "^7.10.1"
+    "@babel/plugin-transform-exponentiation-operator" "^7.10.1"
+    "@babel/plugin-transform-for-of" "^7.10.1"
+    "@babel/plugin-transform-function-name" "^7.10.1"
+    "@babel/plugin-transform-literals" "^7.10.1"
+    "@babel/plugin-transform-member-expression-literals" "^7.10.1"
+    "@babel/plugin-transform-modules-amd" "^7.10.1"
+    "@babel/plugin-transform-modules-commonjs" "^7.10.1"
+    "@babel/plugin-transform-modules-systemjs" "^7.10.1"
+    "@babel/plugin-transform-modules-umd" "^7.10.1"
     "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
-    "@babel/plugin-transform-new-target" "^7.8.3"
-    "@babel/plugin-transform-object-super" "^7.8.3"
-    "@babel/plugin-transform-parameters" "^7.9.5"
-    "@babel/plugin-transform-property-literals" "^7.8.3"
-    "@babel/plugin-transform-regenerator" "^7.8.7"
-    "@babel/plugin-transform-reserved-words" "^7.8.3"
-    "@babel/plugin-transform-shorthand-properties" "^7.8.3"
-    "@babel/plugin-transform-spread" "^7.8.3"
-    "@babel/plugin-transform-sticky-regex" "^7.8.3"
-    "@babel/plugin-transform-template-literals" "^7.8.3"
-    "@babel/plugin-transform-typeof-symbol" "^7.8.4"
-    "@babel/plugin-transform-unicode-regex" "^7.8.3"
+    "@babel/plugin-transform-new-target" "^7.10.1"
+    "@babel/plugin-transform-object-super" "^7.10.1"
+    "@babel/plugin-transform-parameters" "^7.10.1"
+    "@babel/plugin-transform-property-literals" "^7.10.1"
+    "@babel/plugin-transform-regenerator" "^7.10.1"
+    "@babel/plugin-transform-reserved-words" "^7.10.1"
+    "@babel/plugin-transform-shorthand-properties" "^7.10.1"
+    "@babel/plugin-transform-spread" "^7.10.1"
+    "@babel/plugin-transform-sticky-regex" "^7.10.1"
+    "@babel/plugin-transform-template-literals" "^7.10.1"
+    "@babel/plugin-transform-typeof-symbol" "^7.10.1"
+    "@babel/plugin-transform-unicode-escapes" "^7.10.1"
+    "@babel/plugin-transform-unicode-regex" "^7.10.1"
     "@babel/preset-modules" "^0.1.3"
-    "@babel/types" "^7.9.6"
-    browserslist "^4.11.1"
+    "@babel/types" "^7.10.2"
+    browserslist "^4.12.0"
     core-js-compat "^3.6.2"
     invariant "^2.2.2"
     levenary "^1.1.1"
@@ -871,17 +960,18 @@
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
-"@babel/preset-react@^7.9.4":
-  version "7.9.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d"
-  integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==
+"@babel/preset-react@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041"
+  integrity sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-transform-react-display-name" "^7.8.3"
-    "@babel/plugin-transform-react-jsx" "^7.9.4"
-    "@babel/plugin-transform-react-jsx-development" "^7.9.0"
-    "@babel/plugin-transform-react-jsx-self" "^7.9.0"
-    "@babel/plugin-transform-react-jsx-source" "^7.9.0"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-transform-react-display-name" "^7.10.1"
+    "@babel/plugin-transform-react-jsx" "^7.10.1"
+    "@babel/plugin-transform-react-jsx-development" "^7.10.1"
+    "@babel/plugin-transform-react-jsx-self" "^7.10.1"
+    "@babel/plugin-transform-react-jsx-source" "^7.10.1"
+    "@babel/plugin-transform-react-pure-annotations" "^7.10.1"
 
 "@babel/runtime-corejs3@^7.8.3":
   version "7.8.7"
@@ -898,50 +988,43 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f"
-  integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==
-  dependencies:
-    regenerator-runtime "^0.12.0"
-
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
-  integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
+  integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
   dependencies:
     regenerator-runtime "^0.13.4"
 
-"@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
-  version "7.8.6"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
-  integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/parser" "^7.8.6"
-    "@babel/types" "^7.8.6"
-
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442"
-  integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/generator" "^7.9.6"
-    "@babel/helper-function-name" "^7.9.5"
-    "@babel/helper-split-export-declaration" "^7.8.3"
-    "@babel/parser" "^7.9.6"
-    "@babel/types" "^7.9.6"
+"@babel/template@^7.10.1", "@babel/template@^7.3.3", "@babel/template@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811"
+  integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==
+  dependencies:
+    "@babel/code-frame" "^7.10.1"
+    "@babel/parser" "^7.10.1"
+    "@babel/types" "^7.10.1"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27"
+  integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.1"
+    "@babel/generator" "^7.10.1"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
+    "@babel/parser" "^7.10.1"
+    "@babel/types" "^7.10.1"
     debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7"
-  integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.9.0":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d"
+  integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.9.5"
+    "@babel/helper-validator-identifier" "^7.10.1"
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
@@ -1063,12 +1146,13 @@
   integrity sha512-J3n5SKim+ZoLbe44hRGI/VYAwSMCeIJuBy+FfP6EZaujEpNchPRFcIsVQLWAwpU1bP2Ji63rC+rEUOd1vjUB6Q==
 
 "@istanbuljs/load-nyc-config@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b"
-  integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+  integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
   dependencies:
     camelcase "^5.3.1"
     find-up "^4.1.0"
+    get-package-type "^0.1.0"
     js-yaml "^3.13.1"
     resolve-from "^5.0.0"
 
@@ -1077,7 +1161,7 @@
   resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd"
   integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
 
-"@jest/console@^25.4.0", "@jest/console@^25.5.0":
+"@jest/console@^25.5.0":
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb"
   integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==
@@ -1088,33 +1172,33 @@
     jest-util "^25.5.0"
     slash "^3.0.0"
 
-"@jest/core@^25.4.0":
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.4.0.tgz#cc1fe078df69b8f0fbb023bb0bcee23ef3b89411"
-  integrity sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==
-  dependencies:
-    "@jest/console" "^25.4.0"
-    "@jest/reporters" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/transform" "^25.4.0"
-    "@jest/types" "^25.4.0"
+"@jest/core@^25.4.0", "@jest/core@^25.5.4":
+  version "25.5.4"
+  resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4"
+  integrity sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==
+  dependencies:
+    "@jest/console" "^25.5.0"
+    "@jest/reporters" "^25.5.1"
+    "@jest/test-result" "^25.5.0"
+    "@jest/transform" "^25.5.1"
+    "@jest/types" "^25.5.0"
     ansi-escapes "^4.2.1"
     chalk "^3.0.0"
     exit "^0.1.2"
-    graceful-fs "^4.2.3"
-    jest-changed-files "^25.4.0"
-    jest-config "^25.4.0"
-    jest-haste-map "^25.4.0"
-    jest-message-util "^25.4.0"
+    graceful-fs "^4.2.4"
+    jest-changed-files "^25.5.0"
+    jest-config "^25.5.4"
+    jest-haste-map "^25.5.1"
+    jest-message-util "^25.5.0"
     jest-regex-util "^25.2.6"
-    jest-resolve "^25.4.0"
-    jest-resolve-dependencies "^25.4.0"
-    jest-runner "^25.4.0"
-    jest-runtime "^25.4.0"
-    jest-snapshot "^25.4.0"
-    jest-util "^25.4.0"
-    jest-validate "^25.4.0"
-    jest-watcher "^25.4.0"
+    jest-resolve "^25.5.1"
+    jest-resolve-dependencies "^25.5.4"
+    jest-runner "^25.5.4"
+    jest-runtime "^25.5.4"
+    jest-snapshot "^25.5.1"
+    jest-util "^25.5.0"
+    jest-validate "^25.5.0"
+    jest-watcher "^25.5.0"
     micromatch "^4.0.2"
     p-each-series "^2.1.0"
     realpath-native "^2.0.0"
@@ -1122,7 +1206,7 @@
     slash "^3.0.0"
     strip-ansi "^6.0.0"
 
-"@jest/environment@^25.4.0", "@jest/environment@^25.5.0":
+"@jest/environment@^25.5.0":
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37"
   integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==
@@ -1151,29 +1235,30 @@
     "@jest/types" "^25.5.0"
     expect "^25.5.0"
 
-"@jest/reporters@^25.4.0":
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.4.0.tgz#836093433b32ce4e866298af2d6fcf6ed351b0b0"
-  integrity sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==
+"@jest/reporters@^25.5.1":
+  version "25.5.1"
+  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b"
+  integrity sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==
   dependencies:
     "@bcoe/v8-coverage" "^0.2.3"
-    "@jest/console" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/transform" "^25.4.0"
-    "@jest/types" "^25.4.0"
+    "@jest/console" "^25.5.0"
+    "@jest/test-result" "^25.5.0"
+    "@jest/transform" "^25.5.1"
+    "@jest/types" "^25.5.0"
     chalk "^3.0.0"
     collect-v8-coverage "^1.0.0"
     exit "^0.1.2"
     glob "^7.1.2"
+    graceful-fs "^4.2.4"
     istanbul-lib-coverage "^3.0.0"
     istanbul-lib-instrument "^4.0.0"
     istanbul-lib-report "^3.0.0"
     istanbul-lib-source-maps "^4.0.0"
     istanbul-reports "^3.0.2"
-    jest-haste-map "^25.4.0"
-    jest-resolve "^25.4.0"
-    jest-util "^25.4.0"
-    jest-worker "^25.4.0"
+    jest-haste-map "^25.5.1"
+    jest-resolve "^25.5.1"
+    jest-util "^25.5.0"
+    jest-worker "^25.5.0"
     slash "^3.0.0"
     source-map "^0.6.0"
     string-length "^3.1.0"
@@ -1191,7 +1276,7 @@
     graceful-fs "^4.2.4"
     source-map "^0.6.0"
 
-"@jest/test-result@^25.4.0", "@jest/test-result@^25.5.0":
+"@jest/test-result@^25.5.0":
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c"
   integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==
@@ -1212,7 +1297,7 @@
     jest-runner "^25.5.4"
     jest-runtime "^25.5.4"
 
-"@jest/transform@^25.2.4", "@jest/transform@^25.4.0", "@jest/transform@^25.5.1":
+"@jest/transform@^25.2.4", "@jest/transform@^25.5.1":
   version "25.5.1"
   resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3"
   integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==
@@ -1234,7 +1319,7 @@
     source-map "^0.6.1"
     write-file-atomic "^3.0.0"
 
-"@jest/types@^25.2.3", "@jest/types@^25.4.0", "@jest/types@^25.5.0":
+"@jest/types@^25.2.3", "@jest/types@^25.5.0":
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d"
   integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==
@@ -1244,19 +1329,47 @@
     "@types/yargs" "^15.0.0"
     chalk "^3.0.0"
 
+"@nodelib/fs.scandir@2.1.3":
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+  integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.3"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+  integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+  integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.3"
+    fastq "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
+  integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
+  dependencies:
+    mkdirp "^1.0.4"
+
 "@rails/ujs@^6.0.3":
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.3.tgz#e68a03278e30daea6a110aac5dfa33c60c53055d"
   integrity sha512-CM9OEvoN9eXkaX7PXEnbsQLULJ97b9rVmwliZbz/iBOERLJ68Rk3ClJe+fQEMKU4CBZfky2lIRnfslOdUs9SLQ==
 
 "@sinonjs/commons@^1.7.0":
-  version "1.7.2"
-  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2"
-  integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d"
+  integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==
   dependencies:
     type-detect "4.0.8"
 
-"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7":
+"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.3":
   version "7.1.7"
   resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89"
   integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==
@@ -1267,6 +1380,17 @@
     "@types/babel__template" "*"
     "@types/babel__traverse" "*"
 
+"@types/babel__core@^7.1.7":
+  version "7.1.8"
+  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.8.tgz#057f725aca3641f49fc11c7a87a9de5ec588a5d7"
+  integrity sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==
+  dependencies:
+    "@babel/parser" "^7.1.0"
+    "@babel/types" "^7.0.0"
+    "@types/babel__generator" "*"
+    "@types/babel__template" "*"
+    "@types/babel__traverse" "*"
+
 "@types/babel__generator@*":
   version "7.6.1"
   resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04"
@@ -1283,9 +1407,9 @@
     "@babel/types" "^7.0.0"
 
 "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
-  version "7.0.11"
-  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18"
-  integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==
+  version "7.0.12"
+  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.12.tgz#22f49a028e69465390f87bb103ebd61bd086b8f5"
+  integrity sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==
   dependencies:
     "@babel/types" "^7.3.0"
 
@@ -1335,15 +1459,20 @@
     "@types/istanbul-lib-coverage" "*"
     "@types/istanbul-lib-report" "*"
 
+"@types/json-schema@^7.0.4":
+  version "7.0.4"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
+  integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
+
 "@types/minimatch@*":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
   integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
 
 "@types/node@*":
-  version "13.13.5"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.5.tgz#96ec3b0afafd64a4ccea9107b75bf8489f0e5765"
-  integrity sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==
+  version "14.0.11"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.11.tgz#61d4886e2424da73b7b25547f59fdcb534c165a3"
+  integrity sha512-lCvvI24L21ZVeIiyIUHZ5Oflv1hhHQ5E1S25IRlKIXaRkVgmXpJMI3wUJkmym2bTbCe+WoIibQnMVAU3FguaOg==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"
@@ -1365,13 +1494,6 @@
   resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
   integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
 
-"@types/react@16.4.6":
-  version "16.4.6"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada"
-  integrity sha512-9LDZdhsuKSc+DjY65SjBkA958oBWcTWSVWAd2cD9XqKBjhGw1KzAkRhWRw2eIsXvaIE/TOTjjKMFVC+JA1iU4g==
-  dependencies:
-    csstype "^2.2.0"
-
 "@types/schema-utils@^1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@types/schema-utils/-/schema-utils-1.0.0.tgz#295d36f01e2cb8bc3207ca1d9a68e210db6b40cb"
@@ -1659,7 +1781,7 @@ ajv@^4.7.0:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5, ajv@^6.9.1:
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5, ajv@^6.9.1:
   version "6.12.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
   integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
@@ -1831,6 +1953,11 @@ array-union@^1.0.1:
   dependencies:
     array-uniq "^1.0.1"
 
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
 array-uniq@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -1938,18 +2065,18 @@ atrament@0.2.4:
   resolved "https://registry.yarnpkg.com/atrament/-/atrament-0.2.4.tgz#6f78196edfcd194e568b7c0b9c88201ec371ac66"
   integrity sha512-hSA9VwW6COMwvRhSEO4uZweZ91YGOdHqwvslNyrJZG+8mzc4qx/qMsDZBuAeXFeWZO/QKtRjIXguOUy1aNMl3A==
 
-autoprefixer@^9.7.6:
-  version "9.7.6"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4"
-  integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==
+autoprefixer@^9.8.0:
+  version "9.8.0"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511"
+  integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==
   dependencies:
-    browserslist "^4.11.1"
-    caniuse-lite "^1.0.30001039"
+    browserslist "^4.12.0"
+    caniuse-lite "^1.0.30001061"
     chalk "^2.4.2"
     normalize-range "^0.1.2"
     num2fraction "^1.2.2"
-    postcss "^7.0.27"
-    postcss-value-parser "^4.0.3"
+    postcss "^7.0.30"
+    postcss-value-parser "^4.1.0"
 
 aws-sign2@~0.7.0:
   version "0.7.0"
@@ -1957,9 +2084,9 @@ aws-sign2@~0.7.0:
   integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
 
 aws4@^1.8.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
-  integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2"
+  integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==
 
 axios@^0.19.2:
   version "0.19.2"
@@ -1973,15 +2100,15 @@ axobject-query@^2.0.2:
   resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
   integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
 
-babel-eslint@^10.0.3:
-  version "10.0.3"
-  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
-  integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
+babel-eslint@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+  integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.0.0"
-    "@babel/traverse" "^7.0.0"
-    "@babel/types" "^7.0.0"
+    "@babel/parser" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
     eslint-visitor-keys "^1.0.0"
     resolve "^1.12.0"
 
@@ -2396,7 +2523,7 @@ browserify-zlib@^0.2.0:
   dependencies:
     pako "~1.0.5"
 
-browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.8.5:
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5:
   version "4.12.0"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
   integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
@@ -2457,7 +2584,7 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
-cacache@^12.0.2, cacache@^12.0.3:
+cacache@^12.0.2:
   version "12.0.4"
   resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
   integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
@@ -2478,11 +2605,12 @@ cacache@^12.0.2, cacache@^12.0.3:
     unique-filename "^1.1.1"
     y18n "^4.0.0"
 
-cacache@^15.0.3:
-  version "15.0.3"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.3.tgz#2225c2d1dd8e872339950d6a39c051e0e9334392"
-  integrity sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==
+cacache@^15.0.3, cacache@^15.0.4:
+  version "15.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.4.tgz#b2c23cf4ac4f5ead004fb15a0efb0a20340741f1"
+  integrity sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==
   dependencies:
+    "@npmcli/move-file" "^1.0.1"
     chownr "^2.0.0"
     fs-minipass "^2.0.0"
     glob "^7.1.4"
@@ -2493,7 +2621,6 @@ cacache@^15.0.3:
     minipass-flush "^1.0.5"
     minipass-pipeline "^1.2.2"
     mkdirp "^1.0.3"
-    move-file "^2.0.0"
     p-map "^4.0.0"
     promise-inflight "^1.0.1"
     rimraf "^3.0.2"
@@ -2567,10 +2694,10 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043:
-  version "1.0.30001061"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001061.tgz#80ca87ef14eb543a7458e7fd2b5e2face3458c9f"
-  integrity sha512-SMICCeiNvMZnyXpuoO+ot7FHpMVPlrsR+HmfByj6nY4xYDHXLqMTbgH7ecEkDNXWkH1vaip+ZS0D7VTXwM1KYQ==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061:
+  version "1.0.30001078"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001078.tgz#e1b6e2ae327b6a1ec11f65ec7a0dde1e7093074c"
+  integrity sha512-sF12qXe9VMm32IEf/+NDvmTpwJaaU7N1igpiH2FdI4DyABJSsOqG3ZAcFvszLkoLoo1y6VJLMYivukUAxaMASw==
 
 capture-exit@^2.0.0:
   version "2.0.0"
@@ -2839,9 +2966,9 @@ color-string@^1.5.2:
     simple-swizzle "^0.2.2"
 
 color@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc"
-  integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
+  integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
   dependencies:
     color-convert "^1.9.1"
     color-string "^1.5.2"
@@ -2985,23 +3112,22 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-copy-webpack-plugin@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88"
-  integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==
+copy-webpack-plugin@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz#10efc6ad219a61acbf2f5fb50af83da38431bc34"
+  integrity sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==
   dependencies:
-    cacache "^12.0.3"
-    find-cache-dir "^2.1.0"
-    glob-parent "^3.1.0"
-    globby "^7.1.1"
-    is-glob "^4.0.1"
-    loader-utils "^1.2.3"
-    minimatch "^3.0.4"
+    cacache "^15.0.4"
+    fast-glob "^3.2.2"
+    find-cache-dir "^3.3.1"
+    glob-parent "^5.1.1"
+    globby "^11.0.1"
+    loader-utils "^2.0.0"
     normalize-path "^3.0.0"
-    p-limit "^2.2.1"
-    schema-utils "^1.0.0"
-    serialize-javascript "^2.1.2"
-    webpack-log "^2.0.0"
+    p-limit "^2.3.0"
+    schema-utils "^2.7.0"
+    serialize-javascript "^3.1.0"
+    webpack-sources "^1.4.3"
 
 core-js-compat@^3.6.2:
   version "3.6.5"
@@ -3026,24 +3152,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
-cosmiconfig@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
-  integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==
-  dependencies:
-    is-directory "^0.3.1"
-    js-yaml "^3.9.0"
-    parse-json "^4.0.0"
-    require-from-string "^2.0.1"
-
 cosmiconfig@^5.0.0:
-  version "5.0.7"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04"
-  integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
   dependencies:
     import-fresh "^2.0.0"
     is-directory "^0.3.1"
-    js-yaml "^3.9.0"
+    js-yaml "^3.13.1"
     parse-json "^4.0.0"
 
 cosmiconfig@^6.0.0:
@@ -3107,9 +3223,9 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
     which "^1.2.9"
 
 cross-spawn@^7.0.0:
-  version "7.0.2"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
-  integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
   dependencies:
     path-key "^3.1.0"
     shebang-command "^2.0.0"
@@ -3358,7 +3474,7 @@ cssstyle@^2.0.0:
   dependencies:
     cssom "~0.3.6"
 
-csstype@^2.2.0, csstype@^2.5.7, csstype@^2.6.7:
+csstype@^2.5.7, csstype@^2.6.7:
   version "2.6.10"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b"
   integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==
@@ -3579,12 +3695,12 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
-dir-glob@^2.0.0:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
-  integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
   dependencies:
-    path-type "^3.0.0"
+    path-type "^4.0.0"
 
 discontinuous-range@1.0.0:
   version "1.0.0"
@@ -3750,9 +3866,9 @@ ee-first@1.1.1:
   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
 
 ejs@^2.3.4, ejs@^2.6.1:
-  version "2.7.1"
-  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228"
-  integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+  integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
 electron-to-chromium@^1.3.413:
   version "1.3.448"
@@ -4015,9 +4131,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
 escodegen@^1.11.1:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
-  integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.2.tgz#14ab71bf5026c2aa08173afba22c6f3173284a84"
+  integrity sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==
   dependencies:
     esprima "^4.0.1"
     estraverse "^4.2.0"
@@ -4090,10 +4206,10 @@ eslint-plugin-promise@~4.2.1:
   resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
   integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
 
-eslint-plugin-react@~7.19.0:
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
-  integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
+eslint-plugin-react@~7.20.0:
+  version "7.20.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3"
+  integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==
   dependencies:
     array-includes "^3.1.1"
     doctrine "^2.1.0"
@@ -4104,7 +4220,6 @@ eslint-plugin-react@~7.19.0:
     object.values "^1.1.1"
     prop-types "^15.7.2"
     resolve "^1.15.1"
-    semver "^6.3.0"
     string.prototype.matchall "^4.0.2"
     xregexp "^4.3.0"
 
@@ -4241,11 +4356,11 @@ esprima@^4.0.0, esprima@^4.0.1:
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
 esquery@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
-  integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+  integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
   dependencies:
-    estraverse "^4.0.0"
+    estraverse "^5.1.0"
 
 esrecurse@^4.1.0:
   version "4.2.1"
@@ -4254,11 +4369,16 @@ esrecurse@^4.1.0:
   dependencies:
     estraverse "^4.1.0"
 
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
   integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
+estraverse@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+  integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
 esutils@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@@ -4484,6 +4604,18 @@ fast-deep-equal@^3.1.1:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
   integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
 
+fast-glob@^3.1.1, fast-glob@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
+  integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
+
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -4499,6 +4631,13 @@ favico.js@^0.3.10:
   resolved "https://registry.yarnpkg.com/favico.js/-/favico.js-0.3.10.tgz#80586e27a117f24a8d51c18a99bdc714d4339301"
   integrity sha1-gFhuJ6EX8kqNUcGKmb3HFNQzkwE=
 
+fastq@^1.6.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
+  integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
+  dependencies:
+    reusify "^1.0.4"
+
 faye-websocket@^0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
@@ -4555,13 +4694,13 @@ file-entry-cache@^5.0.1:
   dependencies:
     flat-cache "^2.0.1"
 
-file-loader@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8"
-  integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==
+file-loader@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f"
+  integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==
   dependencies:
-    loader-utils "^1.4.0"
-    schema-utils "^2.5.0"
+    loader-utils "^2.0.0"
+    schema-utils "^2.6.5"
 
 file-type@^12.4.1:
   version "12.4.2"
@@ -4703,9 +4842,9 @@ follow-redirects@1.5.10:
     debug "=3.1.0"
 
 follow-redirects@^1.0.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f"
-  integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb"
+  integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==
   dependencies:
     debug "^3.0.0"
 
@@ -4885,6 +5024,11 @@ get-caller-file@^2.0.1:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
+get-package-type@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+  integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
 get-stream@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -4919,14 +5063,7 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954"
-  integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==
-  dependencies:
-    is-glob "^4.0.1"
-
-glob-parent@~5.1.0:
+glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
   integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
@@ -4998,6 +5135,18 @@ globals@^9.2.0:
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
   integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
 
+globby@^11.0.1:
+  version "11.0.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
+  integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.1.1"
+    ignore "^5.1.4"
+    merge2 "^1.3.0"
+    slash "^3.0.0"
+
 globby@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -5009,18 +5158,6 @@ globby@^6.1.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
-globby@^7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
-  integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA=
-  dependencies:
-    array-union "^1.0.1"
-    dir-glob "^2.0.0"
-    glob "^7.1.2"
-    ignore "^3.3.5"
-    pify "^3.0.0"
-    slash "^1.0.0"
-
 globule@^1.0.0:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9"
@@ -5037,7 +5174,7 @@ gonzales-pe-sl@^4.2.3:
   dependencies:
     minimist "1.1.x"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
   version "4.2.4"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
@@ -5345,9 +5482,9 @@ http-proxy-middleware@0.19.1:
     micromatch "^3.1.10"
 
 http-proxy@^1.17.0:
-  version "1.18.0"
-  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a"
-  integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==
+  version "1.18.1"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+  integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
   dependencies:
     eventemitter3 "^4.0.0"
     follow-redirects "^1.0.0"
@@ -5401,7 +5538,7 @@ iferr@^0.1.5:
   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
   integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
 
-ignore@^3.1.2, ignore@^3.3.5:
+ignore@^3.1.2:
   version "3.3.10"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
   integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
@@ -5411,6 +5548,11 @@ ignore@^4.0.6:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
+ignore@^5.1.4:
+  version "5.1.6"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.6.tgz#643194ad4bf2712f37852e386b6998eff0db2106"
+  integrity sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==
+
 immutable@^3.8.2:
   version "3.8.2"
   resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
@@ -5710,9 +5852,9 @@ is-boolean-object@^1.0.1:
   integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==
 
 is-callable@^1.1.4, is-callable@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
-  integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
+  integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
 
 is-ci@^2.0.0:
   version "2.0.0"
@@ -5775,6 +5917,11 @@ is-directory@^0.3.1:
   resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
   integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
 
+is-docker@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b"
+  integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==
+
 is-electron@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0"
@@ -5920,11 +6067,11 @@ is-property@^1.0.0, is-property@^1.0.2:
   integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
 
 is-regex@^1.0.4, is-regex@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
-  integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
+  integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==
   dependencies:
-    has "^1.0.3"
+    has-symbols "^1.0.1"
 
 is-resolvable@^1.0.0:
   version "1.1.0"
@@ -5986,9 +6133,11 @@ is-wsl@^1.1.0:
   integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
 
 is-wsl@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d"
-  integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
 
 isarray@0.0.1:
   version "0.0.1"
@@ -6063,7 +6212,7 @@ istanbul-reports@^3.0.2:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
 
-jest-changed-files@^25.4.0:
+jest-changed-files@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c"
   integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==
@@ -6073,25 +6222,26 @@ jest-changed-files@^25.4.0:
     throat "^5.0.0"
 
 jest-cli@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.4.0.tgz#5dac8be0fece6ce39f0d671395a61d1357322bab"
-  integrity sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==
+  version "25.5.4"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d"
+  integrity sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==
   dependencies:
-    "@jest/core" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/types" "^25.4.0"
+    "@jest/core" "^25.5.4"
+    "@jest/test-result" "^25.5.0"
+    "@jest/types" "^25.5.0"
     chalk "^3.0.0"
     exit "^0.1.2"
+    graceful-fs "^4.2.4"
     import-local "^3.0.2"
     is-ci "^2.0.0"
-    jest-config "^25.4.0"
-    jest-util "^25.4.0"
-    jest-validate "^25.4.0"
+    jest-config "^25.5.4"
+    jest-util "^25.5.0"
+    jest-validate "^25.5.0"
     prompts "^2.0.1"
     realpath-native "^2.0.0"
     yargs "^15.3.1"
 
-jest-config@^25.4.0, jest-config@^25.5.4:
+jest-config@^25.5.4:
   version "25.5.4"
   resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c"
   integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==
@@ -6173,7 +6323,7 @@ jest-get-type@^25.2.6:
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877"
   integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
 
-jest-haste-map@^25.4.0, jest-haste-map@^25.5.1:
+jest-haste-map@^25.5.1:
   version "25.5.1"
   resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943"
   integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==
@@ -6193,7 +6343,7 @@ jest-haste-map@^25.4.0, jest-haste-map@^25.5.1:
   optionalDependencies:
     fsevents "^2.1.2"
 
-jest-jasmine2@^25.4.0, jest-jasmine2@^25.5.4:
+jest-jasmine2@^25.5.4:
   version "25.5.4"
   resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968"
   integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==
@@ -6216,7 +6366,7 @@ jest-jasmine2@^25.4.0, jest-jasmine2@^25.5.4:
     pretty-format "^25.5.0"
     throat "^5.0.0"
 
-jest-leak-detector@^25.4.0, jest-leak-detector@^25.5.0:
+jest-leak-detector@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb"
   integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==
@@ -6234,7 +6384,7 @@ jest-matcher-utils@^25.5.0:
     jest-get-type "^25.2.6"
     pretty-format "^25.5.0"
 
-jest-message-util@^25.4.0, jest-message-util@^25.5.0:
+jest-message-util@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea"
   integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==
@@ -6265,16 +6415,16 @@ jest-regex-util@^25.2.6:
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964"
   integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==
 
-jest-resolve-dependencies@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz#783937544cfc40afcc7c569aa54748c4b3f83f5a"
-  integrity sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A==
+jest-resolve-dependencies@^25.5.4:
+  version "25.5.4"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7"
+  integrity sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==
   dependencies:
-    "@jest/types" "^25.4.0"
+    "@jest/types" "^25.5.0"
     jest-regex-util "^25.2.6"
-    jest-snapshot "^25.4.0"
+    jest-snapshot "^25.5.1"
 
-jest-resolve@^25.4.0, jest-resolve@^25.5.1:
+jest-resolve@^25.5.1:
   version "25.5.1"
   resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829"
   integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==
@@ -6289,31 +6439,6 @@ jest-resolve@^25.4.0, jest-resolve@^25.5.1:
     resolve "^1.17.0"
     slash "^3.0.0"
 
-jest-runner@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.4.0.tgz#6ca4a3d52e692bbc081228fa68f750012f1f29e5"
-  integrity sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA==
-  dependencies:
-    "@jest/console" "^25.4.0"
-    "@jest/environment" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/types" "^25.4.0"
-    chalk "^3.0.0"
-    exit "^0.1.2"
-    graceful-fs "^4.2.3"
-    jest-config "^25.4.0"
-    jest-docblock "^25.3.0"
-    jest-haste-map "^25.4.0"
-    jest-jasmine2 "^25.4.0"
-    jest-leak-detector "^25.4.0"
-    jest-message-util "^25.4.0"
-    jest-resolve "^25.4.0"
-    jest-runtime "^25.4.0"
-    jest-util "^25.4.0"
-    jest-worker "^25.4.0"
-    source-map-support "^0.5.6"
-    throat "^5.0.0"
-
 jest-runner@^25.5.4:
   version "25.5.4"
   resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d"
@@ -6339,7 +6464,7 @@ jest-runner@^25.5.4:
     source-map-support "^0.5.6"
     throat "^5.0.0"
 
-jest-runtime@^25.4.0, jest-runtime@^25.5.4:
+jest-runtime@^25.5.4:
   version "25.5.4"
   resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab"
   integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==
@@ -6378,7 +6503,7 @@ jest-serializer@^25.5.0:
   dependencies:
     graceful-fs "^4.2.4"
 
-jest-snapshot@^25.4.0, jest-snapshot@^25.5.1:
+jest-snapshot@^25.5.1:
   version "25.5.1"
   resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f"
   integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==
@@ -6399,7 +6524,7 @@ jest-snapshot@^25.4.0, jest-snapshot@^25.5.1:
     pretty-format "^25.5.0"
     semver "^6.3.0"
 
-jest-util@^25.4.0, jest-util@^25.5.0:
+jest-util@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0"
   integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==
@@ -6410,7 +6535,7 @@ jest-util@^25.4.0, jest-util@^25.5.0:
     is-ci "^2.0.0"
     make-dir "^3.0.0"
 
-jest-validate@^25.4.0, jest-validate@^25.5.0:
+jest-validate@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a"
   integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==
@@ -6422,7 +6547,7 @@ jest-validate@^25.4.0, jest-validate@^25.5.0:
     leven "^3.1.0"
     pretty-format "^25.5.0"
 
-jest-watcher@^25.4.0:
+jest-watcher@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456"
   integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==
@@ -6434,7 +6559,7 @@ jest-watcher@^25.4.0:
     jest-util "^25.5.0"
     string-length "^3.1.0"
 
-jest-worker@^25.4.0, jest-worker@^25.5.0:
+jest-worker@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1"
   integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==
@@ -6474,7 +6599,15 @@ js-string-escape@1.0.1:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0:
+js-yaml@^3.13.1:
+  version "3.14.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+  integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
   integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -6732,6 +6865,15 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4
     emojis-list "^3.0.0"
     json5 "^1.0.1"
 
+loader-utils@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+  integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^2.1.2"
+
 locate-path@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@@ -6958,6 +7100,11 @@ merge-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
   integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
 
+merge2@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
+  integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
+
 merge@^1.2.0:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
@@ -7082,9 +7229,9 @@ minipass-flush@^1.0.5:
     minipass "^3.0.0"
 
 minipass-pipeline@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a"
-  integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34"
+  integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==
   dependencies:
     minipass "^3.0.0"
 
@@ -7161,13 +7308,6 @@ move-concurrently@^1.0.1:
     rimraf "^2.5.4"
     run-queue "^1.0.3"
 
-move-file@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.0.0.tgz#83ffa309b5d7f69d518b28e1333e2ffadf331e3e"
-  integrity sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==
-  dependencies:
-    path-exists "^4.0.0"
-
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -7325,9 +7465,9 @@ node-notifier@^6.0.0:
     which "^1.3.1"
 
 node-releases@^1.1.53:
-  version "1.1.56"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.56.tgz#bc054a417d316e3adac90eafb7e1932802f28705"
-  integrity sha512-EVo605FhWLygH8a64TjgpjyHYOihkxECwX1bHHr8tETJKWEiWS2YJjPbvsX2jFjnjTNEgBCmk9mLjKG1Mf11cw==
+  version "1.1.57"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.57.tgz#f6754ce225fad0611e61228df3e09232e017ea19"
+  integrity sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==
 
 normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
   version "2.5.0"
@@ -7482,13 +7622,12 @@ object.assign@^4.1.0:
     object-keys "^1.0.11"
 
 object.entries@^1.1.0, object.entries@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b"
-  integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
+  integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
   dependencies:
     define-properties "^1.1.3"
-    es-abstract "^1.17.0-next.1"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
     has "^1.0.3"
 
 object.fromentries@^2.0.2:
@@ -7665,7 +7804,7 @@ p-limit@^1.1.0:
   dependencies:
     p-try "^1.0.0"
 
-p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.3.0:
+p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
   integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
@@ -7896,22 +8035,15 @@ path-type@^2.0.0:
   dependencies:
     pify "^2.0.0"
 
-path-type@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
-  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
-  dependencies:
-    pify "^3.0.0"
-
 path-type@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
 pbkdf2@^3.0.3:
-  version "3.0.17"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
-  integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+  integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
   dependencies:
     create-hash "^1.1.2"
     create-hmac "^1.1.4"
@@ -7989,11 +8121,6 @@ pify@^2.0.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
   integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
 
-pify@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
-  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@@ -8127,11 +8254,11 @@ postcss-discard-overridden@^4.0.1:
     postcss "^7.0.0"
 
 postcss-load-config@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484"
-  integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
+  integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
   dependencies:
-    cosmiconfig "^4.0.0"
+    cosmiconfig "^5.0.0"
     import-cwd "^2.0.0"
 
 postcss-loader@^3.0.0:
@@ -8400,7 +8527,7 @@ postcss-value-parser@^3.0.0:
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
   integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
 
-postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3:
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3, postcss-value-parser@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
   integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
@@ -8415,10 +8542,10 @@ postcss@^5.0.16:
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6:
-  version "7.0.29"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.29.tgz#d3a903872bd52280b83bce38cdc83ce55c06129e"
-  integrity sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6:
+  version "7.0.31"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.31.tgz#332af45cb73e26c0ee2614d7c7fb02dfcc2bd6dd"
+  integrity sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"
@@ -8435,9 +8562,9 @@ postgres-bytea@~1.0.0:
   integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
 
 postgres-date@~1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8"
-  integrity sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g=
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.5.tgz#710b27de5f27d550f6e80b5d34f7ba189213c2ee"
+  integrity sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==
 
 postgres-interval@^1.1.0:
   version "1.2.0"
@@ -8672,7 +8799,7 @@ randexp@0.4.6:
     discontinuous-range "1.0.0"
     ret "~0.1.10"
 
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
   integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -8713,11 +8840,11 @@ react-dom@^16.13.1:
     scheduler "^0.19.1"
 
 react-event-listener@^0.6.0:
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.5.tgz#d374dbe5da485c9f9d4702f0e76971afbe9b6b2e"
-  integrity sha512-//lCxOM3DQ0+xmTa/u9mI9mm55zCPdIKp89d8MGjlNsOOnXQ5sFDD1eed+sMBzQXKiRBLBMtSg/2T9RJFtfovw==
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a"
+  integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==
   dependencies:
-    "@babel/runtime" "7.2.0"
+    "@babel/runtime" "^7.2.0"
     prop-types "^15.6.0"
     warning "^4.0.1"
 
@@ -8739,12 +8866,10 @@ react-immutable-proptypes@^2.2.0:
   dependencies:
     invariant "^2.2.2"
 
-react-immutable-pure-component@^1.1.1:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.3.tgz#fa33638df68cfe9f73ccbee1d5861c17f3053f86"
-  integrity sha512-kNy2A/fDrSuR8TKwB+4ynmItmp1vgF87tWxxfmadwDYo2J3ANipHqTjDIBvJvJ7libvuh76jIbvmK0krjtKH1g==
-  optionalDependencies:
-    "@types/react" "16.4.6"
+react-immutable-pure-component@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz#3014d3e20cd5a7a4db73b81f1f1464f4d351684b"
+  integrity sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==
 
 react-infinite-scroller@^1.0.12:
   version "1.2.4"
@@ -8942,13 +9067,14 @@ react-test-renderer@^16.0.0-0, react-test-renderer@^16.13.1:
     react-is "^16.8.6"
     scheduler "^0.19.1"
 
-react-textarea-autosize@^7.1.2:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz#70fdb333ef86bcca72717e25e623e90c336e2cda"
-  integrity sha512-uH3ORCsCa3C6LHxExExhF4jHoXYCQwE5oECmrRsunlspaDAbS4mGKNlWZqjLfInWtFQcf0o1n1jC/NGXFdUBCg==
+react-textarea-autosize@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.0.1.tgz#fce0dbf6a59b7b9d892c6af40b6be06a29f62c49"
+  integrity sha512-Qs7Lm17F0CIsWeDaUcHPpP22etVQHkayOcMgOXTfVasVToS6G+IL+5a7ECZtbDR2qTgTRIXjYcLmuZUuTX4tNA==
   dependencies:
-    "@babel/runtime" "^7.1.2"
-    prop-types "^15.6.0"
+    "@babel/runtime" "^7.8.4"
+    use-composed-ref "^1.0.0"
+    use-latest "^1.0.0"
 
 react-toggle@^4.1.1:
   version "4.1.1"
@@ -9193,9 +9319,9 @@ regexpu-core@^4.6.0, regexpu-core@^4.7.0:
     unicode-match-property-value-ecmascript "^1.2.0"
 
 regjsgen@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
-  integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+  integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
 
 regjsparser@^0.6.4:
   version "0.6.4"
@@ -9276,7 +9402,7 @@ require-directory@^2.1.1:
   resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
   integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
 
-require-from-string@^2.0.1, require-from-string@^2.0.2:
+require-from-string@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
   integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
@@ -9404,6 +9530,11 @@ retry@^0.12.0:
   resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
   integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
 
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
 rgb-regex@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
@@ -9470,6 +9601,11 @@ run-async@^2.2.0:
   dependencies:
     is-promise "^2.1.0"
 
+run-parallel@^1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+  integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
 run-queue@^1.0.0, run-queue@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
@@ -9593,12 +9729,13 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
-schema-utils@^2.2.0, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6:
-  version "2.6.6"
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c"
-  integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==
+schema-utils@^2.2.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+  integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
   dependencies:
-    ajv "^6.12.0"
+    "@types/json-schema" "^7.0.4"
+    ajv "^6.12.2"
     ajv-keywords "^3.4.1"
 
 scroll-behavior@^0.9.1:
@@ -9665,10 +9802,12 @@ serialize-javascript@^2.1.2:
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
   integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
 
-serialize-javascript@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e"
-  integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==
+serialize-javascript@^3.0.0, serialize-javascript@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
+  integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
+  dependencies:
+    randombytes "^2.1.0"
 
 serve-index@^1.9.1:
   version "1.9.1"
@@ -10452,17 +10591,17 @@ terser-webpack-plugin@^1.4.3:
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
-terser-webpack-plugin@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz#31928c9330a582fb5ec6f90805337289b85cb8fe"
-  integrity sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==
+terser-webpack-plugin@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz#23bda2687b197f878a743373b9411d917adc2e45"
+  integrity sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==
   dependencies:
-    cacache "^15.0.3"
+    cacache "^15.0.4"
     find-cache-dir "^3.3.1"
     jest-worker "^26.0.0"
     p-limit "^2.3.0"
     schema-utils "^2.6.6"
-    serialize-javascript "^3.0.0"
+    serialize-javascript "^3.1.0"
     source-map "^0.6.1"
     terser "^4.6.13"
     webpack-sources "^1.4.3"
@@ -10657,6 +10796,11 @@ tryer@^1.0.1:
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
   integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
 
+ts-essentials@^2.0.3:
+  version "2.0.12"
+  resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745"
+  integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==
+
 tslib@^1.9.0:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
@@ -10849,6 +10993,18 @@ url@^0.11.0:
     punycode "1.3.2"
     querystring "0.2.0"
 
+use-composed-ref@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.0.0.tgz#bb13e8f4a0b873632cde4940abeb88b92d03023a"
+  integrity sha512-RVqY3NFNjZa0xrmK3bIMWNmQ01QjKPDc7DeWR3xa/N8aliVppuutOE5bZzPkQfvL+5NRWMMp0DJ99Trd974FIw==
+  dependencies:
+    ts-essentials "^2.0.3"
+
+use-latest@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.0.0.tgz#c86d2e4893b15f27def69da574a47136d107facb"
+  integrity sha512-CxmFi75KTXeTIBlZq3LhJ4Hz98pCaRKZHCpnbiaEHIr5QnuHvH8lKYoluPBt/ik7j/hFVPB8K3WqF6mQvLyQTg==
+
 use@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@@ -10964,9 +11120,9 @@ verror@1.10.0:
     extsprintf "^1.2.0"
 
 vm-browserify@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
-  integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
 
 w3c-hr-time@^1.0.1:
   version "1.0.2"
@@ -11053,10 +11209,10 @@ webpack-assets-manifest@^3.1.1:
     tapable "^1.0.0"
     webpack-sources "^1.0.0"
 
-webpack-bundle-analyzer@^3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz#84da434e89442899b884d9ad38e466d0db02a56f"
-  integrity sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA==
+webpack-bundle-analyzer@^3.8.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16"
+  integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==
   dependencies:
     acorn "^7.1.1"
     acorn-walk "^7.1.1"
@@ -11208,9 +11364,9 @@ websocket-driver@>=0.5.1:
     websocket-extensions ">=0.1.1"
 
 websocket-extensions@>=0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
-  integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+  integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
 
 whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
   version "1.0.5"