diff --git a/.flowconfig b/.flowconfig
index 4d0f9b0..bcc0450 100644
--- a/.flowconfig
+++ b/.flowconfig
@@ -1,6 +1,5 @@
 [ignore]
 
-
 [include]
 
 [libs]
diff --git a/LICENSE b/LICENSE
index a7487a7..e8be4ab 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2017-2021 LBRY Inc
+Copyright (c) 2017-2020 LBRY Inc
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
 "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,
diff --git a/README.md b/README.md
index 26add4b..5486461 100644
--- a/README.md
+++ b/README.md
@@ -20,9 +20,6 @@ yarn link lbry-redux
 ### Build
 Run `$ yarn build`. If the symlink does not work, just build the file and move the `bundle.js` file into the `node_modules/` folder.
 
-### Tests
-Run `$ yarn test`.
-
 ## Contributing 
 We :heart: contributions from everyone! We welcome [bug reports](https://github.com/lbryio/lbry-redux/issues/), [bug fixes](https://github.com/lbryio/lbry-redux/pulls) and feedback on the module is always appreciated.
 
diff --git a/dist/bundle.es.js b/dist/bundle.es.js
index b477130..3009f54 100644
--- a/dist/bundle.es.js
+++ b/dist/bundle.es.js
@@ -5,9 +5,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
 function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
 
 require('proxy-polyfill');
-var uuid = require('uuid');
+var uuid = _interopDefault(require('uuid/v4'));
 var reselect = require('reselect');
-var fromEntries = _interopDefault(require('@ungap/from-entries'));
 
 const MINIMUM_PUBLISH_BID = 0.00000001;
 
@@ -15,22 +14,11 @@ const CHANNEL_ANONYMOUS = 'anonymous';
 const CHANNEL_NEW = 'new';
 const PAGE_SIZE = 20;
 
-const LEVEL_1_STAKED_AMOUNT = 0;
-const LEVEL_2_STAKED_AMOUNT = 1;
-const LEVEL_3_STAKED_AMOUNT = 50;
-const LEVEL_4_STAKED_AMOUNT = 250;
-const LEVEL_5_STAKED_AMOUNT = 1000;
-
 var claim = /*#__PURE__*/Object.freeze({
   MINIMUM_PUBLISH_BID: MINIMUM_PUBLISH_BID,
   CHANNEL_ANONYMOUS: CHANNEL_ANONYMOUS,
   CHANNEL_NEW: CHANNEL_NEW,
-  PAGE_SIZE: PAGE_SIZE,
-  LEVEL_1_STAKED_AMOUNT: LEVEL_1_STAKED_AMOUNT,
-  LEVEL_2_STAKED_AMOUNT: LEVEL_2_STAKED_AMOUNT,
-  LEVEL_3_STAKED_AMOUNT: LEVEL_3_STAKED_AMOUNT,
-  LEVEL_4_STAKED_AMOUNT: LEVEL_4_STAKED_AMOUNT,
-  LEVEL_5_STAKED_AMOUNT: LEVEL_5_STAKED_AMOUNT
+  PAGE_SIZE: PAGE_SIZE
 });
 
 const WINDOW_FOCUSED = 'WINDOW_FOCUSED';
@@ -114,16 +102,6 @@ const SET_TRANSACTION_LIST_FILTER = 'SET_TRANSACTION_LIST_FILTER';
 const UPDATE_CURRENT_HEIGHT = 'UPDATE_CURRENT_HEIGHT';
 const SET_DRAFT_TRANSACTION_AMOUNT = 'SET_DRAFT_TRANSACTION_AMOUNT';
 const SET_DRAFT_TRANSACTION_ADDRESS = 'SET_DRAFT_TRANSACTION_ADDRESS';
-const FETCH_UTXO_COUNT_STARTED = 'FETCH_UTXO_COUNT_STARTED';
-const FETCH_UTXO_COUNT_COMPLETED = 'FETCH_UTXO_COUNT_COMPLETED';
-const FETCH_UTXO_COUNT_FAILED = 'FETCH_UTXO_COUNT_FAILED';
-const TIP_CLAIM_MASS_STARTED = 'TIP_CLAIM_MASS_STARTED';
-const TIP_CLAIM_MASS_COMPLETED = 'TIP_CLAIM_MASS_COMPLETED';
-const TIP_CLAIM_MASS_FAILED = 'TIP_CLAIM_MASS_FAILED';
-const DO_UTXO_CONSOLIDATE_STARTED = 'DO_UTXO_CONSOLIDATE_STARTED';
-const DO_UTXO_CONSOLIDATE_COMPLETED = 'DO_UTXO_CONSOLIDATE_COMPLETED';
-const DO_UTXO_CONSOLIDATE_FAILED = 'DO_UTXO_CONSOLIDATE_FAILED';
-const PENDING_CONSOLIDATED_TXOS_UPDATED = 'PENDING_CONSOLIDATED_TXOS_UPDATED';
 
 // Claims
 const RESOLVE_URIS_STARTED = 'RESOLVE_URIS_STARTED';
@@ -137,9 +115,6 @@ const ABANDON_CLAIM_SUCCEEDED = 'ABANDON_CLAIM_SUCCEEDED';
 const FETCH_CHANNEL_LIST_STARTED = 'FETCH_CHANNEL_LIST_STARTED';
 const FETCH_CHANNEL_LIST_COMPLETED = 'FETCH_CHANNEL_LIST_COMPLETED';
 const FETCH_CHANNEL_LIST_FAILED = 'FETCH_CHANNEL_LIST_FAILED';
-const FETCH_COLLECTION_LIST_STARTED = 'FETCH_COLLECTION_LIST_STARTED';
-const FETCH_COLLECTION_LIST_COMPLETED = 'FETCH_COLLECTION_LIST_COMPLETED';
-const FETCH_COLLECTION_LIST_FAILED = 'FETCH_COLLECTION_LIST_FAILED';
 const CREATE_CHANNEL_STARTED = 'CREATE_CHANNEL_STARTED';
 const CREATE_CHANNEL_COMPLETED = 'CREATE_CHANNEL_COMPLETED';
 const CREATE_CHANNEL_FAILED = 'CREATE_CHANNEL_FAILED';
@@ -149,7 +124,6 @@ const UPDATE_CHANNEL_FAILED = 'UPDATE_CHANNEL_FAILED';
 const IMPORT_CHANNEL_STARTED = 'IMPORT_CHANNEL_STARTED';
 const IMPORT_CHANNEL_COMPLETED = 'IMPORT_CHANNEL_COMPLETED';
 const IMPORT_CHANNEL_FAILED = 'IMPORT_CHANNEL_FAILED';
-const CLEAR_CHANNEL_ERRORS = 'CLEAR_CHANNEL_ERRORS';
 const PUBLISH_STARTED = 'PUBLISH_STARTED';
 const PUBLISH_COMPLETED = 'PUBLISH_COMPLETED';
 const PUBLISH_FAILED = 'PUBLISH_FAILED';
@@ -168,6 +142,7 @@ const CLAIM_REPOST_STARTED = 'CLAIM_REPOST_STARTED';
 const CLAIM_REPOST_COMPLETED = 'CLAIM_REPOST_COMPLETED';
 const CLAIM_REPOST_FAILED = 'CLAIM_REPOST_FAILED';
 const CLEAR_REPOST_ERROR = 'CLEAR_REPOST_ERROR';
+const CLEAR_CHANNEL_ERRORS = 'CLEAR_CHANNEL_ERRORS';
 const CHECK_PUBLISH_NAME_STARTED = 'CHECK_PUBLISH_NAME_STARTED';
 const CHECK_PUBLISH_NAME_COMPLETED = 'CHECK_PUBLISH_NAME_COMPLETED';
 const UPDATE_PENDING_CLAIMS = 'UPDATE_PENDING_CLAIMS';
@@ -180,27 +155,6 @@ const PURCHASE_LIST_STARTED = 'PURCHASE_LIST_STARTED';
 const PURCHASE_LIST_COMPLETED = 'PURCHASE_LIST_COMPLETED';
 const PURCHASE_LIST_FAILED = 'PURCHASE_LIST_FAILED';
 
-const COLLECTION_PUBLISH_STARTED = 'COLLECTION_PUBLISH_STARTED';
-const COLLECTION_PUBLISH_COMPLETED = 'COLLECTION_PUBLISH_COMPLETED';
-const COLLECTION_PUBLISH_FAILED = 'COLLECTION_PUBLISH_FAILED';
-const COLLECTION_PUBLISH_UPDATE_STARTED = 'COLLECTION_PUBLISH_UPDATE_STARTED';
-const COLLECTION_PUBLISH_UPDATE_COMPLETED = 'COLLECTION_PUBLISH_UPDATE_COMPLETED';
-const COLLECTION_PUBLISH_UPDATE_FAILED = 'COLLECTION_PUBLISH_UPDATE_FAILED';
-const COLLECTION_PUBLISH_ABANDON_STARTED = 'COLLECTION_PUBLISH_ABANDON_STARTED';
-const COLLECTION_PUBLISH_ABANDON_COMPLETED = 'COLLECTION_PUBLISH_ABANDON_COMPLETED';
-const COLLECTION_PUBLISH_ABANDON_FAILED = 'COLLECTION_PUBLISH_ABANDON_FAILED';
-const CLEAR_COLLECTION_ERRORS = 'CLEAR_COLLECTION_ERRORS';
-const COLLECTION_ITEMS_RESOLVE_STARTED = 'COLLECTION_ITEMS_RESOLVE_STARTED';
-const COLLECTION_ITEMS_RESOLVE_COMPLETED = 'COLLECTION_ITEMS_RESOLVE_COMPLETED';
-const COLLECTION_ITEMS_RESOLVE_FAILED = 'COLLECTION_ITEMS_RESOLVE_FAILED';
-const COLLECTION_NEW = 'COLLECTION_NEW';
-const COLLECTION_DELETE = 'COLLECTION_DELETE';
-const COLLECTION_PENDING = 'COLLECTION_PENDING';
-const COLLECTION_EDIT = 'COLLECTION_EDIT';
-const COLLECTION_COPY = 'COLLECTION_COPY';
-const COLLECTION_SAVE = 'COLLECTION_SAVE';
-const COLLECTION_ERROR = 'COLLECTION_ERROR';
-
 // Comments
 const COMMENT_LIST_STARTED = 'COMMENT_LIST_STARTED';
 const COMMENT_LIST_COMPLETED = 'COMMENT_LIST_COMPLETED';
@@ -335,9 +289,13 @@ const FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED';
 const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
 const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
 
+// Tags
+const TOGGLE_TAG_FOLLOW = 'TOGGLE_TAG_FOLLOW';
+const TAG_ADD = 'TAG_ADD';
+const TAG_DELETE = 'TAG_DELETE';
+
 // Sync
 const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
-const SYNC_FATAL_ERROR = 'SYNC_FATAL_ERROR';
 
 var action_types = /*#__PURE__*/Object.freeze({
   WINDOW_FOCUSED: WINDOW_FOCUSED,
@@ -415,16 +373,6 @@ var action_types = /*#__PURE__*/Object.freeze({
   UPDATE_CURRENT_HEIGHT: UPDATE_CURRENT_HEIGHT,
   SET_DRAFT_TRANSACTION_AMOUNT: SET_DRAFT_TRANSACTION_AMOUNT,
   SET_DRAFT_TRANSACTION_ADDRESS: SET_DRAFT_TRANSACTION_ADDRESS,
-  FETCH_UTXO_COUNT_STARTED: FETCH_UTXO_COUNT_STARTED,
-  FETCH_UTXO_COUNT_COMPLETED: FETCH_UTXO_COUNT_COMPLETED,
-  FETCH_UTXO_COUNT_FAILED: FETCH_UTXO_COUNT_FAILED,
-  TIP_CLAIM_MASS_STARTED: TIP_CLAIM_MASS_STARTED,
-  TIP_CLAIM_MASS_COMPLETED: TIP_CLAIM_MASS_COMPLETED,
-  TIP_CLAIM_MASS_FAILED: TIP_CLAIM_MASS_FAILED,
-  DO_UTXO_CONSOLIDATE_STARTED: DO_UTXO_CONSOLIDATE_STARTED,
-  DO_UTXO_CONSOLIDATE_COMPLETED: DO_UTXO_CONSOLIDATE_COMPLETED,
-  DO_UTXO_CONSOLIDATE_FAILED: DO_UTXO_CONSOLIDATE_FAILED,
-  PENDING_CONSOLIDATED_TXOS_UPDATED: PENDING_CONSOLIDATED_TXOS_UPDATED,
   RESOLVE_URIS_STARTED: RESOLVE_URIS_STARTED,
   RESOLVE_URIS_COMPLETED: RESOLVE_URIS_COMPLETED,
   FETCH_CHANNEL_CLAIMS_STARTED: FETCH_CHANNEL_CLAIMS_STARTED,
@@ -436,9 +384,6 @@ var action_types = /*#__PURE__*/Object.freeze({
   FETCH_CHANNEL_LIST_STARTED: FETCH_CHANNEL_LIST_STARTED,
   FETCH_CHANNEL_LIST_COMPLETED: FETCH_CHANNEL_LIST_COMPLETED,
   FETCH_CHANNEL_LIST_FAILED: FETCH_CHANNEL_LIST_FAILED,
-  FETCH_COLLECTION_LIST_STARTED: FETCH_COLLECTION_LIST_STARTED,
-  FETCH_COLLECTION_LIST_COMPLETED: FETCH_COLLECTION_LIST_COMPLETED,
-  FETCH_COLLECTION_LIST_FAILED: FETCH_COLLECTION_LIST_FAILED,
   CREATE_CHANNEL_STARTED: CREATE_CHANNEL_STARTED,
   CREATE_CHANNEL_COMPLETED: CREATE_CHANNEL_COMPLETED,
   CREATE_CHANNEL_FAILED: CREATE_CHANNEL_FAILED,
@@ -448,7 +393,6 @@ var action_types = /*#__PURE__*/Object.freeze({
   IMPORT_CHANNEL_STARTED: IMPORT_CHANNEL_STARTED,
   IMPORT_CHANNEL_COMPLETED: IMPORT_CHANNEL_COMPLETED,
   IMPORT_CHANNEL_FAILED: IMPORT_CHANNEL_FAILED,
-  CLEAR_CHANNEL_ERRORS: CLEAR_CHANNEL_ERRORS,
   PUBLISH_STARTED: PUBLISH_STARTED,
   PUBLISH_COMPLETED: PUBLISH_COMPLETED,
   PUBLISH_FAILED: PUBLISH_FAILED,
@@ -467,6 +411,7 @@ var action_types = /*#__PURE__*/Object.freeze({
   CLAIM_REPOST_COMPLETED: CLAIM_REPOST_COMPLETED,
   CLAIM_REPOST_FAILED: CLAIM_REPOST_FAILED,
   CLEAR_REPOST_ERROR: CLEAR_REPOST_ERROR,
+  CLEAR_CHANNEL_ERRORS: CLEAR_CHANNEL_ERRORS,
   CHECK_PUBLISH_NAME_STARTED: CHECK_PUBLISH_NAME_STARTED,
   CHECK_PUBLISH_NAME_COMPLETED: CHECK_PUBLISH_NAME_COMPLETED,
   UPDATE_PENDING_CLAIMS: UPDATE_PENDING_CLAIMS,
@@ -478,26 +423,6 @@ var action_types = /*#__PURE__*/Object.freeze({
   PURCHASE_LIST_STARTED: PURCHASE_LIST_STARTED,
   PURCHASE_LIST_COMPLETED: PURCHASE_LIST_COMPLETED,
   PURCHASE_LIST_FAILED: PURCHASE_LIST_FAILED,
-  COLLECTION_PUBLISH_STARTED: COLLECTION_PUBLISH_STARTED,
-  COLLECTION_PUBLISH_COMPLETED: COLLECTION_PUBLISH_COMPLETED,
-  COLLECTION_PUBLISH_FAILED: COLLECTION_PUBLISH_FAILED,
-  COLLECTION_PUBLISH_UPDATE_STARTED: COLLECTION_PUBLISH_UPDATE_STARTED,
-  COLLECTION_PUBLISH_UPDATE_COMPLETED: COLLECTION_PUBLISH_UPDATE_COMPLETED,
-  COLLECTION_PUBLISH_UPDATE_FAILED: COLLECTION_PUBLISH_UPDATE_FAILED,
-  COLLECTION_PUBLISH_ABANDON_STARTED: COLLECTION_PUBLISH_ABANDON_STARTED,
-  COLLECTION_PUBLISH_ABANDON_COMPLETED: COLLECTION_PUBLISH_ABANDON_COMPLETED,
-  COLLECTION_PUBLISH_ABANDON_FAILED: COLLECTION_PUBLISH_ABANDON_FAILED,
-  CLEAR_COLLECTION_ERRORS: CLEAR_COLLECTION_ERRORS,
-  COLLECTION_ITEMS_RESOLVE_STARTED: COLLECTION_ITEMS_RESOLVE_STARTED,
-  COLLECTION_ITEMS_RESOLVE_COMPLETED: COLLECTION_ITEMS_RESOLVE_COMPLETED,
-  COLLECTION_ITEMS_RESOLVE_FAILED: COLLECTION_ITEMS_RESOLVE_FAILED,
-  COLLECTION_NEW: COLLECTION_NEW,
-  COLLECTION_DELETE: COLLECTION_DELETE,
-  COLLECTION_PENDING: COLLECTION_PENDING,
-  COLLECTION_EDIT: COLLECTION_EDIT,
-  COLLECTION_COPY: COLLECTION_COPY,
-  COLLECTION_SAVE: COLLECTION_SAVE,
-  COLLECTION_ERROR: COLLECTION_ERROR,
   COMMENT_LIST_STARTED: COMMENT_LIST_STARTED,
   COMMENT_LIST_COMPLETED: COMMENT_LIST_COMPLETED,
   COMMENT_LIST_FAILED: COMMENT_LIST_FAILED,
@@ -611,8 +536,10 @@ var action_types = /*#__PURE__*/Object.freeze({
   FETCH_COST_INFO_STARTED: FETCH_COST_INFO_STARTED,
   FETCH_COST_INFO_COMPLETED: FETCH_COST_INFO_COMPLETED,
   FETCH_COST_INFO_FAILED: FETCH_COST_INFO_FAILED,
-  USER_STATE_POPULATE: USER_STATE_POPULATE,
-  SYNC_FATAL_ERROR: SYNC_FATAL_ERROR
+  TOGGLE_TAG_FOLLOW: TOGGLE_TAG_FOLLOW,
+  TAG_ADD: TAG_ADD,
+  TAG_DELETE: TAG_DELETE,
+  USER_STATE_POPULATE: USER_STATE_POPULATE
 });
 
 const CC_LICENSES = [{
@@ -702,15 +629,9 @@ const SHOW_NSFW = 'showNsfw';
 const CREDIT_REQUIRED_ACKNOWLEDGED = 'credit_required_acknowledged';
 const NEW_USER_ACKNOWLEDGED = 'welcome_acknowledged';
 const EMAIL_COLLECTION_ACKNOWLEDGED = 'email_collection_acknowledged';
-const FIRST_RUN_STARTED = 'first_run_started';
 const INVITE_ACKNOWLEDGED = 'invite_acknowledged';
-const FOLLOWING_ACKNOWLEDGED = 'following_acknowledged';
-const TAGS_ACKNOWLEDGED = 'tags_acknowledged';
-const REWARDS_ACKNOWLEDGED = 'rewards_acknowledged';
 const LANGUAGE = 'language';
-const SEARCH_IN_LANGUAGE = 'search_in_language';
 const SHOW_MATURE = 'show_mature';
-const HOMEPAGE = 'homepage';
 const HIDE_REPOSTS = 'hide_reposts';
 const SHOW_ANONYMOUS = 'show_anonymous';
 const SHOW_UNAVAILABLE = 'show_unavailable';
@@ -719,24 +640,17 @@ const INSTANT_PURCHASE_MAX = 'instant_purchase_max';
 const THEME = 'theme';
 const THEMES = 'themes';
 const AUTOMATIC_DARK_MODE_ENABLED = 'automatic_dark_mode_enabled';
-const AUTOPLAY_MEDIA = 'autoplay';
+const AUTOPLAY = 'autoplay';
 const AUTOPLAY_NEXT = 'autoplay_next';
 const OS_NOTIFICATIONS_ENABLED = 'os_notifications_enabled';
 const AUTO_DOWNLOAD = 'auto_download';
 const AUTO_LAUNCH = 'auto_launch';
-const TO_TRAY_WHEN_CLOSED = 'to_tray_when_closed';
 const SUPPORT_OPTION = 'support_option';
 const HIDE_BALANCE = 'hide_balance';
 const HIDE_SPLASH_ANIMATION = 'hide_splash_animation';
 const FLOATING_PLAYER = 'floating_player';
 const DARK_MODE_TIMES = 'dark_mode_times';
 const ENABLE_SYNC = 'enable_sync';
-const ENABLE_PUBLISH_PREVIEW = 'enable-publish-preview';
-const TILE_LAYOUT = 'tile_layout';
-const VIDEO_THEATER_MODE = 'video_theater_mode';
-const VIDEO_PLAYBACK_RATE = 'video_playback_rate';
-const CUSTOM_COMMENTS_SERVER_ENABLED = 'custom_comments_server_enabled';
-const CUSTOM_COMMENTS_SERVER_URL = 'custom_comments_server_url';
 
 // mobile settings
 const BACKGROUND_PLAY_ENABLED = 'backgroundPlayEnabled';
@@ -753,15 +667,9 @@ var settings = /*#__PURE__*/Object.freeze({
   CREDIT_REQUIRED_ACKNOWLEDGED: CREDIT_REQUIRED_ACKNOWLEDGED,
   NEW_USER_ACKNOWLEDGED: NEW_USER_ACKNOWLEDGED,
   EMAIL_COLLECTION_ACKNOWLEDGED: EMAIL_COLLECTION_ACKNOWLEDGED,
-  FIRST_RUN_STARTED: FIRST_RUN_STARTED,
   INVITE_ACKNOWLEDGED: INVITE_ACKNOWLEDGED,
-  FOLLOWING_ACKNOWLEDGED: FOLLOWING_ACKNOWLEDGED,
-  TAGS_ACKNOWLEDGED: TAGS_ACKNOWLEDGED,
-  REWARDS_ACKNOWLEDGED: REWARDS_ACKNOWLEDGED,
   LANGUAGE: LANGUAGE,
-  SEARCH_IN_LANGUAGE: SEARCH_IN_LANGUAGE,
   SHOW_MATURE: SHOW_MATURE,
-  HOMEPAGE: HOMEPAGE,
   HIDE_REPOSTS: HIDE_REPOSTS,
   SHOW_ANONYMOUS: SHOW_ANONYMOUS,
   SHOW_UNAVAILABLE: SHOW_UNAVAILABLE,
@@ -770,24 +678,17 @@ var settings = /*#__PURE__*/Object.freeze({
   THEME: THEME,
   THEMES: THEMES,
   AUTOMATIC_DARK_MODE_ENABLED: AUTOMATIC_DARK_MODE_ENABLED,
-  AUTOPLAY_MEDIA: AUTOPLAY_MEDIA,
+  AUTOPLAY: AUTOPLAY,
   AUTOPLAY_NEXT: AUTOPLAY_NEXT,
   OS_NOTIFICATIONS_ENABLED: OS_NOTIFICATIONS_ENABLED,
   AUTO_DOWNLOAD: AUTO_DOWNLOAD,
   AUTO_LAUNCH: AUTO_LAUNCH,
-  TO_TRAY_WHEN_CLOSED: TO_TRAY_WHEN_CLOSED,
   SUPPORT_OPTION: SUPPORT_OPTION,
   HIDE_BALANCE: HIDE_BALANCE,
   HIDE_SPLASH_ANIMATION: HIDE_SPLASH_ANIMATION,
   FLOATING_PLAYER: FLOATING_PLAYER,
   DARK_MODE_TIMES: DARK_MODE_TIMES,
   ENABLE_SYNC: ENABLE_SYNC,
-  ENABLE_PUBLISH_PREVIEW: ENABLE_PUBLISH_PREVIEW,
-  TILE_LAYOUT: TILE_LAYOUT,
-  VIDEO_THEATER_MODE: VIDEO_THEATER_MODE,
-  VIDEO_PLAYBACK_RATE: VIDEO_PLAYBACK_RATE,
-  CUSTOM_COMMENTS_SERVER_ENABLED: CUSTOM_COMMENTS_SERVER_ENABLED,
-  CUSTOM_COMMENTS_SERVER_URL: CUSTOM_COMMENTS_SERVER_URL,
   BACKGROUND_PLAY_ENABLED: BACKGROUND_PLAY_ENABLED,
   FOREGROUND_NOTIFICATION_ENABLED: FOREGROUND_NOTIFICATION_ENABLED,
   KEEP_DAEMON_RUNNING: KEEP_DAEMON_RUNNING,
@@ -1040,49 +941,22 @@ var daemon_settings = /*#__PURE__*/Object.freeze({
 const SDK_SYNC_KEYS = [LBRYUM_SERVERS, SHARE_USAGE_DATA];
 
 // CLIENT
-const CLIENT_SYNC_KEYS = [SHOW_MATURE, HIDE_REPOSTS, SHOW_ANONYMOUS, INSTANT_PURCHASE_ENABLED, INSTANT_PURCHASE_MAX, THEME, AUTOPLAY_MEDIA, AUTOPLAY_NEXT, HIDE_BALANCE, HIDE_SPLASH_ANIMATION, FLOATING_PLAYER, DARK_MODE_TIMES, AUTOMATIC_DARK_MODE_ENABLED, LANGUAGE];
+const CLIENT_SYNC_KEYS = [SHOW_MATURE, HIDE_REPOSTS, SHOW_ANONYMOUS, INSTANT_PURCHASE_ENABLED, INSTANT_PURCHASE_MAX, THEME, AUTOPLAY, HIDE_BALANCE, HIDE_SPLASH_ANIMATION, FLOATING_PLAYER, DARK_MODE_TIMES, AUTOMATIC_DARK_MODE_ENABLED];
+
+/*
+
+ */
 
 var shared_preferences = /*#__PURE__*/Object.freeze({
   SDK_SYNC_KEYS: SDK_SYNC_KEYS,
   CLIENT_SYNC_KEYS: CLIENT_SYNC_KEYS
 });
 
-const COLLECTION_ID = 'lid';
-const COLLECTION_INDEX = 'linx';
-
-const COL_TYPE_PLAYLIST = 'playlist';
-const COL_TYPE_CHANNELS = 'channelList';
-
-const WATCH_LATER_ID = 'watchlater';
-const FAVORITES_ID = 'favorites';
-const FAVORITE_CHANNELS_ID = 'favoriteChannels';
-const BUILTIN_LISTS = [WATCH_LATER_ID, FAVORITES_ID, FAVORITE_CHANNELS_ID];
-
-const COL_KEY_EDITED = 'edited';
-const COL_KEY_UNPUBLISHED = 'unpublished';
-const COL_KEY_PENDING = 'pending';
-const COL_KEY_SAVED = 'saved';
-
-var collections = /*#__PURE__*/Object.freeze({
-  COLLECTION_ID: COLLECTION_ID,
-  COLLECTION_INDEX: COLLECTION_INDEX,
-  COL_TYPE_PLAYLIST: COL_TYPE_PLAYLIST,
-  COL_TYPE_CHANNELS: COL_TYPE_CHANNELS,
-  WATCH_LATER_ID: WATCH_LATER_ID,
-  FAVORITES_ID: FAVORITES_ID,
-  FAVORITE_CHANNELS_ID: FAVORITE_CHANNELS_ID,
-  BUILTIN_LISTS: BUILTIN_LISTS,
-  COL_KEY_EDITED: COL_KEY_EDITED,
-  COL_KEY_UNPUBLISHED: COL_KEY_UNPUBLISHED,
-  COL_KEY_PENDING: COL_KEY_PENDING,
-  COL_KEY_SAVED: COL_KEY_SAVED
-});
-
 const DEFAULT_FOLLOWED_TAGS = ['art', 'automotive', 'blockchain', 'comedy', 'economics', 'education', 'gaming', 'music', 'news', 'science', 'sports', 'technology'];
 
 const MATURE_TAGS = ['porn', 'porno', 'nsfw', 'mature', 'xxx', 'sex', 'creampie', 'blowjob', 'handjob', 'vagina', 'boobs', 'big boobs', 'big dick', 'pussy', 'cumshot', 'anal', 'hard fucking', 'ass', 'fuck', 'hentai'];
 
-const DEFAULT_ENGLISH_KNOWN_TAGS = ['free speech', 'censorship', 'gaming', 'pop culture', 'entertainment', 'technology', 'music', 'funny', 'education', 'learning', 'news', 'gameplay', 'nature', 'beliefs', 'comedy', 'games', 'film & animation', 'game', 'weapons', 'blockchain', 'video game', 'sports', 'walkthrough', 'lbrytvpaidbeta', 'art', 'pc', 'minecraft', 'playthrough', 'economics', 'automotive', 'play', 'tutorial', 'twitch', 'how to', 'ps4', 'bitcoin', 'fortnite', 'commentary', 'lets play', 'fun', 'politics', 'travel', 'food', 'science', 'xbox', 'liberal', 'democrat', 'progressive', 'survival', 'non-profits', 'activism', 'cryptocurrency', 'playstation', 'nintendo', 'government', 'steam', 'podcast', 'gamer', 'horror', 'conservative', 'reaction', 'trailer', 'love', 'cnn', 'republican', 'political', 'hangoutsonair', 'hoa', 'msnbc', 'cbs', 'anime', 'donald trump', 'fiction', 'fox news', 'crypto', 'ethereum', 'call of duty', 'android', 'multiplayer', 'epic', 'rpg', 'adventure', 'secular talk', 'btc', 'atheist', 'atheism', 'video games', 'ps3', 'cod', 'online', 'agnostic', 'movie', 'fps', 'lets', 'mod', 'world', 'reviews', 'sharefactory', 'space', 'pokemon', 'stream', 'hilarious', 'lol', 'sony', 'god', 'dance', 'pvp', 'tech', 'strategy', 'zombies', 'fail', 'film', 'xbox360', 'animation', 'unboxing', 'money', 'wwe', 'mods', 'indie', 'pubg', 'ios', 'history', 'rap', 'mobile', 'trump', 'hack', 'flat earth', 'trap', 'humor', 'vlogging', 'fox', 'news radio', 'facebook', 'edm', 'fitness', 'vaping', 'hip hop', 'secular', 'jesus', 'song', 'vape', 'guitar', 'remix', 'mining', 'daily', 'diy', 'pets', 'videogame', 'death', 'funny moments', 'religion', 'media', 'viral', 'war', 'nbc', 'freedom', 'gold', 'family', 'meme', 'zombie', 'photography', 'chill', 'sniper', 'computer', 'iphone', 'dragon', 'bible', 'pro', 'overwatch', 'litecoin', 'gta', 'house', 'fire', 'bass', 'truth', 'crash', 'mario', 'league of legends', 'wii', 'mmorpg', 'health', 'marvel', 'racing', 'apple', 'instrumental', 'earth', 'destiny', 'satire', 'race', 'training', 'electronic', 'boss', 'roblox', 'family friendly', 'california', 'react', 'christian', 'mmo', 'twitter', 'help', 'star', 'cars', 'random', 'top 10', 'ninja', 'guns', 'linux', 'lessons', 'vegan', 'future', 'dota 2', 'studio', 'star wars', 'shooting', 'nasa', 'rock', 'league', 'subscribe', 'water', 'gta v', 'car', 'samsung', 'music video', 'skyrim', 'dog', 'comics', 'shooter game', 'bo3', 'halloween', 'liberty', 'eth', 'conspiracy', 'knife', 'fashion', 'stories', 'vapor', 'nvidia', 'cute', 'beat', 'nintendo switch', 'fantasy', 'christmas', 'world of warcraft', 'industry', 'cartoon', 'garden', 'animals', 'windows', 'happy', 'magic', 'memes', 'design', 'tactical', 'fallout 4', 'puzzle', 'parody', 'rv', 'beats', 'building', 'disney', 'drone', 'ps2', 'beach', 'metal', 'christianity', 'business', 'mix', 'bo2', 'cover', 'senate', '4k', 'united states', 'final', 'hero', 'playing', 'dlc', 'ubisoft', 'halo', 'pc gaming', 'raw', 'investing', 'online learning', 'software', 'ark', 'mojang', 'console', 'battle royale', 'canon', 'microsoft', 'camping', 'ufo', 'progressive talk', 'switch', 'fpv', 'arcade', 'school', 'driving', 'bodybuilding', 'drama', 'retro', 'science fiction', 'eggs', 'australia', 'modded', 'rainbow', 'gamers', 'resident evil', 'drawing', 'brasil', 'england', 'hillary clinton', 'singing', 'final fantasy', 'hiphop', 'video blog', 'mature', 'quad', 'noob', 'simulation', 'illuminati', 'poetry', 'dayz', 'manga', 'howto', 'insane', 'press', 'special', 'church', 'ico', 'weird', 'libertarian', 'crafting', 'level', 'comic', 'sandbox', 'daily vlog', 'outdoor', 'black ops', 'sound', 'christ', 'duty', 'juvenile fiction', 'pc game', 'how-to', 'ww2', 'creepy', 'artist', 'galaxy', 'destiny 2', 'new music', 'quest', 'lee', 'pacman', 'super smash bros', 'day', 'survival horror', 'patreon', 'bitcoin price', 'trending', 'open world', 'wii u', 'dope', 'reaper', 'sniping', 'dubstep', 'truck', 'planet', 'dc', 'amazon', 'spirituality', 'universe', 'video game culture', 'community', 'cat', 'aliens', 'tourism', 'altcoins', 'style', 'travel trailer', 'rda', 'gun', 'secret', 'far cry 5', 'auto', 'culture', 'dj', 'mw2', 'lord', 'full time rving', 'role-playing game', 'prank', 'grand theft auto', 'master', 'wrestling', 'sci-fi', 'workout', 'ghost', 'fake news', 'silly', 'season', 'bo4', 'trading', 'extreme', 'economy', 'combat', 'plays', 'muslim', 'pubg mobile', 'clips', 'bo1', 'paypal', 'sims', 'exploration', 'light', 'ripple', 'paranormal', 'football', 'capcom', 'rta', 'discord', 'batman', 'player', 'server', 'anarchy', 'military', 'playlist', 'cosplay', 'rv park', 'rant', 'edit', 'germany', 'reading', 'chris', 'flash', 'loot', 'bitcoin gratis', 'game reviews', 'movies', 'stupid', 'latest news', 'squad gameplay', 'guru', 'timelapse', 'black ops 3', 'holiday', 'soul', 'motivation', 'mw3', 'vacation', 'sega', '19th century', 'pop', 'sims 4', 'post', 'smok', 'island', 'scotland', 'paladins', 'warrior', 'creepypasta', 'role-playing', 'solar', 'vr', 'animal', 'peace', 'consciousness', 'dota', 'audio', 'mass effect', 'humour', 'first look', 'videogames', 'future bass', 'freestyle', 'hardcore', 'portugal', 'dantdm', 'teaser', 'lbry', 'coronavirus', '2020protests', 'covidcuts', 'covid-19', 'LBRYFoundationBoardCandidacy', 'helplbrysavecrypto'];
+const DEFAULT_ENGLISH_KNOWN_TAGS = ['free speech', 'censorship', 'gaming', 'pop culture', 'entertainment', 'technology', 'music', 'funny', 'education', 'learning', 'news', 'gameplay', 'nature', 'beliefs', 'comedy', 'games', 'film & animation', 'game', 'weapons', 'blockchain', 'video game', 'sports', 'walkthrough', 'lbrytvpaidbeta', 'art', 'pc', 'minecraft', 'playthrough', 'economics', 'automotive', 'play', 'tutorial', 'twitch', 'how to', 'ps4', 'bitcoin', 'fortnite', 'commentary', 'lets play', 'fun', 'politics', 'travel', 'food', 'science', 'xbox', 'liberal', 'democrat', 'progressive', 'survival', 'non-profits', 'activism', 'cryptocurrency', 'playstation', 'nintendo', 'government', 'steam', 'podcast', 'gamer', 'horror', 'conservative', 'reaction', 'trailer', 'love', 'cnn', 'republican', 'political', 'hangoutsonair', 'hoa', 'msnbc', 'cbs', 'anime', 'donald trump', 'fiction', 'fox news', 'crypto', 'ethereum', 'call of duty', 'android', 'multiplayer', 'epic', 'rpg', 'adventure', 'secular talk', 'btc', 'atheist', 'atheism', 'video games', 'ps3', 'cod', 'online', 'agnostic', 'movie', 'fps', 'lets', 'mod', 'world', 'reviews', 'sharefactory', 'space', 'pokemon', 'stream', 'hilarious', 'lol', 'sony', 'god', 'dance', 'pvp', 'tech', 'strategy', 'zombies', 'fail', 'film', 'xbox360', 'animation', 'unboxing', 'money', 'wwe', 'mods', 'indie', 'pubg', 'ios', 'history', 'rap', 'mobile', 'trump', 'hack', 'flat earth', 'trap', 'humor', 'vlogging', 'fox', 'news radio', 'facebook', 'edm', 'fitness', 'vaping', 'hip hop', 'secular', 'jesus', 'song', 'vape', 'guitar', 'remix', 'mining', 'daily', 'diy', 'pets', 'videogame', 'death', 'funny moments', 'religion', 'media', 'viral', 'war', 'nbc', 'freedom', 'gold', 'family', 'meme', 'zombie', 'photography', 'chill', 'sniper', 'computer', 'iphone', 'dragon', 'bible', 'pro', 'overwatch', 'litecoin', 'gta', 'house', 'fire', 'bass', 'truth', 'crash', 'mario', 'league of legends', 'wii', 'mmorpg', 'health', 'marvel', 'racing', 'apple', 'instrumental', 'earth', 'destiny', 'satire', 'race', 'training', 'electronic', 'boss', 'roblox', 'family friendly', 'california', 'react', 'christian', 'mmo', 'twitter', 'help', 'star', 'cars', 'random', 'top 10', 'ninja', 'guns', 'linux', 'lessons', 'vegan', 'future', 'dota 2', 'studio', 'star wars', 'shooting', 'nasa', 'rock', 'league', 'subscribe', 'water', 'gta v', 'car', 'samsung', 'music video', 'skyrim', 'dog', 'comics', 'shooter game', 'bo3', 'halloween', 'liberty', 'eth', 'conspiracy', 'knife', 'fashion', 'stories', 'vapor', 'nvidia', 'cute', 'beat', 'nintendo switch', 'fantasy', 'christmas', 'world of warcraft', 'industry', 'cartoon', 'garden', 'animals', 'windows', 'happy', 'magic', 'memes', 'design', 'tactical', 'fallout 4', 'puzzle', 'parody', 'rv', 'beats', 'building', 'disney', 'drone', 'ps2', 'beach', 'metal', 'christianity', 'business', 'mix', 'bo2', 'cover', 'senate', '4k', 'united states', 'final', 'hero', 'playing', 'dlc', 'ubisoft', 'halo', 'pc gaming', 'raw', 'investing', 'online learning', 'software', 'ark', 'mojang', 'console', 'battle royale', 'canon', 'microsoft', 'camping', 'ufo', 'progressive talk', 'switch', 'fpv', 'arcade', 'school', 'driving', 'bodybuilding', 'drama', 'retro', 'science fiction', 'eggs', 'australia', 'modded', 'rainbow', 'gamers', 'resident evil', 'drawing', 'brasil', 'england', 'hillary clinton', 'singing', 'final fantasy', 'hiphop', 'video blog', 'mature', 'quad', 'noob', 'simulation', 'illuminati', 'poetry', 'dayz', 'manga', 'howto', 'insane', 'press', 'special', 'church', 'ico', 'weird', 'libertarian', 'crafting', 'level', 'comic', 'sandbox', 'daily vlog', 'outdoor', 'black ops', 'sound', 'christ', 'duty', 'juvenile fiction', 'pc game', 'how-to', 'ww2', 'creepy', 'artist', 'galaxy', 'destiny 2', 'new music', 'quest', 'lee', 'pacman', 'super smash bros', 'day', 'survival horror', 'patreon', 'bitcoin price', 'trending', 'open world', 'wii u', 'dope', 'reaper', 'sniping', 'dubstep', 'truck', 'planet', 'dc', 'amazon', 'spirituality', 'universe', 'video game culture', 'community', 'cat', 'aliens', 'tourism', 'altcoins', 'style', 'travel trailer', 'rda', 'gun', 'secret', 'far cry 5', 'auto', 'culture', 'dj', 'mw2', 'lord', 'full time rving', 'role-playing game', 'prank', 'grand theft auto', 'master', 'wrestling', 'sci-fi', 'workout', 'ghost', 'fake news', 'silly', 'season', 'bo4', 'trading', 'extreme', 'economy', 'combat', 'plays', 'muslim', 'pubg mobile', 'clips', 'bo1', 'paypal', 'sims', 'exploration', 'light', 'ripple', 'paranormal', 'football', 'capcom', 'rta', 'discord', 'batman', 'player', 'server', 'anarchy', 'military', 'playlist', 'cosplay', 'rv park', 'rant', 'edit', 'germany', 'reading', 'chris', 'flash', 'loot', 'bitcoin gratis', 'game reviews', 'movies', 'stupid', 'latest news', 'squad gameplay', 'guru', 'timelapse', 'black ops 3', 'holiday', 'soul', 'motivation', 'mw3', 'vacation', 'sega', '19th century', 'pop', 'sims 4', 'post', 'smok', 'island', 'scotland', 'paladins', 'warrior', 'creepypasta', 'role-playing', 'solar', 'vr', 'animal', 'peace', 'consciousness', 'dota', 'audio', 'mass effect', 'humour', 'first look', 'videogames', 'future bass', 'freestyle', 'hardcore', 'portugal', 'dantdm', 'teaser', 'lbry', 'coronavirus', '2020protests', 'covidcuts', 'covid-19'];
 
 const DEFAULT_SPANISH_KNOWN_TAGS = ['español', 'tecnología', 'criptomonedas', 'economía', 'bitcoin', 'educación', 'videojuegos', 'música', 'noticias', 'ciencia', 'deportes', 'latinoamérica', 'latam', 'conspiración', 'humor', 'política', 'tutoriales'];
 
@@ -1166,14 +1040,9 @@ const Lbry = {
   stream_abandon: params => daemonCallWithResult('stream_abandon', params),
   stream_list: params => daemonCallWithResult('stream_list', params),
   channel_abandon: params => daemonCallWithResult('channel_abandon', params),
-  channel_sign: params => daemonCallWithResult('channel_sign', params),
   support_create: params => daemonCallWithResult('support_create', params),
   support_list: params => daemonCallWithResult('support_list', params),
   stream_repost: params => daemonCallWithResult('stream_repost', params),
-  collection_resolve: params => daemonCallWithResult('collection_resolve', params),
-  collection_list: params => daemonCallWithResult('collection_list', params),
-  collection_create: params => daemonCallWithResult('collection_create', params),
-  collection_update: params => daemonCallWithResult('collection_update', params),
 
   // File fetching and manipulation
   file_list: (params = {}) => daemonCallWithResult('file_list', params),
@@ -1197,7 +1066,6 @@ const Lbry = {
   utxo_release: (params = {}) => daemonCallWithResult('utxo_release', params),
   support_abandon: (params = {}) => daemonCallWithResult('support_abandon', params),
   purchase_list: (params = {}) => daemonCallWithResult('purchase_list', params),
-  txo_list: (params = {}) => daemonCallWithResult('txo_list', params),
 
   sync_hash: (params = {}) => daemonCallWithResult('sync_hash', params),
   sync_apply: (params = {}) => daemonCallWithResult('sync_apply', params),
@@ -1480,7 +1348,7 @@ const channelNameMinLength = 1;
 const claimIdMaxLength = 40;
 
 // see https://spec.lbry.com/#urls
-const regexInvalidURI = /[ =&#:$@%?;/\\"<>%{}|^~[\]`\u{0000}-\u{0008}\u{000b}-\u{000c}\u{000e}-\u{001F}\u{D800}-\u{DFFF}\u{FFFE}-\u{FFFF}]/u;
+const regexInvalidURI = /[ =&#:$@%?;/\\"<>%\{\}|^~[\]`\u{0000}-\u{0008}\u{000b}-\u{000c}\u{000e}-\u{001F}\u{D800}-\u{DFFF}\u{FFFE}-\u{FFFF}]/u;
 const regexAddress = /^(b|r)(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/;
 const regexPartProtocol = '^((?:lbry://)?)';
 const regexPartStreamOrChannelName = '([^:$#/]*)';
@@ -1488,11 +1356,6 @@ const regexPartModifierSeparator = '([:$#]?)([^/]*)';
 const queryStringBreaker = '^([\\S]+)([?][\\S]*)';
 const separateQuerystring = new RegExp(queryStringBreaker);
 
-const MOD_SEQUENCE_SEPARATOR = '*';
-const MOD_CLAIM_ID_SEPARATOR_OLD = '#';
-const MOD_CLAIM_ID_SEPARATOR = ':';
-const MOD_BID_POSITION_SEPARATOR = '$';
-
 /**
  * Parses a LBRY name into its component parts. Throws errors with user-friendly
  * messages for invalid names.
@@ -1510,7 +1373,7 @@ const MOD_BID_POSITION_SEPARATOR = '$';
  *   - secondaryBidPosition (int, if present)
  */
 
-function parseURI(url, requireProto = false) {
+function parseURI(URL, requireProto = false) {
   // Break into components. Empty sub-matches are converted to null
 
   const componentsRegex = new RegExp(regexPartProtocol + // protocol
@@ -1520,12 +1383,12 @@ function parseURI(url, requireProto = false) {
   regexPartStreamOrChannelName + regexPartModifierSeparator);
   // chop off the querystring first
   let QSStrippedURL, qs;
-  const qsRegexResult = separateQuerystring.exec(url);
+  const qsRegexResult = separateQuerystring.exec(URL);
   if (qsRegexResult) {
     [QSStrippedURL, qs] = qsRegexResult.slice(1).map(match => match || null);
   }
 
-  const cleanURL = QSStrippedURL || url;
+  const cleanURL = QSStrippedURL || URL;
   const regexMatch = componentsRegex.exec(cleanURL) || [];
   const [proto, ...rest] = regexMatch.slice(1).map(match => match || null);
   const path = rest.join('');
@@ -1545,7 +1408,7 @@ function parseURI(url, requireProto = false) {
 
   rest.forEach(urlPiece => {
     if (urlPiece && urlPiece.includes(' ')) {
-      throw new Error(__('URL can not include a space'));
+      console.error('URL can not include a space');
     }
   });
 
@@ -1594,11 +1457,11 @@ function parseURIModifier(modSeperator, modValue) {
       throw new Error(__(`No modifier provided after separator %modSeperator%.`, { modSeperator }));
     }
 
-    if (modSeperator === MOD_CLAIM_ID_SEPARATOR || MOD_CLAIM_ID_SEPARATOR_OLD) {
+    if (modSeperator === '#') {
       claimId = modValue;
-    } else if (modSeperator === MOD_SEQUENCE_SEPARATOR) {
+    } else if (modSeperator === ':') {
       claimSequence = modValue;
-    } else if (modSeperator === MOD_BID_POSITION_SEPARATOR) {
+    } else if (modSeperator === '$') {
       bidPosition = modValue;
     }
   }
@@ -1729,25 +1592,6 @@ function convertToShareLink(URL) {
   }, true, 'https://open.lbry.com/');
 }
 
-function splitBySeparator(uri) {
-  const protocolLength = 7;
-  return uri.startsWith('lbry://') ? uri.slice(protocolLength).split(/[#:*]/) : uri.split(/#:\*\$/);
-}
-
-function isURIEqual(uriA, uriB) {
-  const parseA = parseURI(normalizeURI(uriA));
-  const parseB = parseURI(normalizeURI(uriB));
-  if (parseA.isChannel) {
-    if (parseB.isChannel && parseA.channelClaimId === parseB.channelClaimId) {
-      return true;
-    }
-  } else if (parseA.streamClaimId === parseB.streamClaimId) {
-    return true;
-  } else {
-    return false;
-  }
-}
-
 /* eslint-disable */
 // underscore's deep equal function
 // https://github.com/jashkenas/underscore/blob/master/underscore.js#L1189
@@ -1863,20 +1707,14 @@ function extractUserState(rawObj) {
   if (rawObj && rawObj.version === '0.1' && rawObj.value) {
     const {
       subscriptions,
-      following,
       tags,
       blocked,
-      coin_swap_codes,
       settings,
       app_welcome_version,
-      sharing_3P,
-      unpublishedCollections,
-      editedCollections,
-      builtinCollections,
-      savedCollections
+      sharing_3P
     } = rawObj.value;
 
-    return _extends$1({}, subscriptions ? { subscriptions } : {}, following ? { following } : {}, tags ? { tags } : {}, blocked ? { blocked } : {}, coin_swap_codes ? { coin_swap_codes } : {}, settings ? { settings } : {}, app_welcome_version ? { app_welcome_version } : {}, sharing_3P ? { sharing_3P } : {}, unpublishedCollections ? { unpublishedCollections } : {}, editedCollections ? { editedCollections } : {}, builtinCollections ? { builtinCollections } : {}, savedCollections ? { savedCollections } : {});
+    return _extends$1({}, subscriptions ? { subscriptions } : {}, tags ? { tags } : {}, blocked ? { blocked } : {}, settings ? { settings } : {}, app_welcome_version ? { app_welcome_version } : {}, sharing_3P ? { sharing_3P } : {});
   }
 
   return {};
@@ -1886,145 +1724,108 @@ function doPopulateSharedUserState(sharedSettings) {
   return dispatch => {
     const {
       subscriptions,
-      following,
       tags,
       blocked,
-      coin_swap_codes,
       settings,
       app_welcome_version,
-      sharing_3P,
-      unpublishedCollections,
-      editedCollections,
-      builtinCollections,
-      savedCollections
+      sharing_3P
     } = extractUserState(sharedSettings);
     dispatch({
       type: USER_STATE_POPULATE,
       data: {
         subscriptions,
-        following,
         tags,
         blocked,
-        coinSwapCodes: coin_swap_codes,
         settings,
         welcomeVersion: app_welcome_version,
-        allowAnalytics: sharing_3P,
-        unpublishedCollections,
-        editedCollections,
-        builtinCollections,
-        savedCollections
+        allowAnalytics: sharing_3P
       }
     });
   };
 }
 
 function doPreferenceSet(key, value, version, success, fail) {
-  return dispatch => {
-    const preference = {
-      type: typeof value,
-      version,
-      value
-    };
-
-    const options = {
-      key,
-      value: JSON.stringify(preference)
-    };
-
-    lbryProxy.preference_set(options).then(() => {
-      if (success) {
-        success(preference);
-      }
-    }).catch(err => {
-      dispatch({
-        type: SYNC_FATAL_ERROR,
-        error: err
-      });
-
-      if (fail) {
-        fail();
-      }
-    });
+  const preference = {
+    type: typeof value,
+    version,
+    value
   };
+
+  const options = {
+    key,
+    value: JSON.stringify(preference)
+  };
+
+  lbryProxy.preference_set(options).then(() => {
+    success(preference);
+  }).catch(() => {
+    if (fail) {
+      fail();
+    }
+  });
 }
 
 function doPreferenceGet(key, success, fail) {
-  return dispatch => {
-    const options = {
-      key
-    };
-
-    return lbryProxy.preference_get(options).then(result => {
-      if (result) {
-        const preference = result[key];
-        return success(preference);
-      }
-
-      return success(null);
-    }).catch(err => {
-      dispatch({
-        type: SYNC_FATAL_ERROR,
-        error: err
-      });
-
-      if (fail) {
-        fail(err);
-      }
-    });
+  const options = {
+    key
   };
+
+  lbryProxy.preference_get(options).then(result => {
+    if (result) {
+      const preference = result[key];
+      return success(preference);
+    }
+
+    return success(null);
+  }).catch(err => {
+    if (fail) {
+      fail(err);
+    }
+  });
 }
 
 //      
 
-const RUN_PREFERENCES_DELAY_MS = 2000;
 const SHARED_PREFERENCE_VERSION = '0.1';
 let oldShared = {};
-let timeout;
-const buildSharedStateMiddleware = (actions, sharedStateFilters, sharedStateCb) => ({
-  getState,
-  dispatch
-}) => next => action => {
+
+const buildSharedStateMiddleware = (actions, sharedStateFilters, sharedStateCb) => ({ getState, dispatch }) => next => action => {
   const currentState = getState();
 
   // We don't care if sync is disabled here, we always want to backup preferences to the wallet
   if (!actions.includes(action.type) || typeof action === 'function') {
     return next(action);
   }
-  clearTimeout(timeout);
+
   const actionResult = next(action);
   // Call `getState` after calling `next` to ensure the state has updated in response to the action
-  function runPreferences() {
-    const nextState = getState();
-    const syncEnabled = nextState.settings && nextState.settings.clientSettings && nextState.settings.clientSettings.enable_sync;
-    const hasVerifiedEmail = nextState.user && nextState.user.user && nextState.user.user.has_verified_email;
-    const preferenceKey = syncEnabled && hasVerifiedEmail ? 'shared' : 'local';
-    const shared = {};
+  const nextState = getState();
+  const preferenceKey = nextState.user && nextState.user.user && nextState.user.user.has_verified_email ? 'shared' : 'anon';
+  const shared = {};
 
-    Object.keys(sharedStateFilters).forEach(key => {
-      const filter = sharedStateFilters[key];
-      const { source, property, transform } = filter;
-      let value = nextState[source][property];
-      if (transform) {
-        value = transform(value);
-      }
-
-      shared[key] = value;
-    });
-
-    if (!isEqual(oldShared, shared)) {
-      // only update if the preference changed from last call in the same session
-      oldShared = shared;
-      dispatch(doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION));
+  Object.keys(sharedStateFilters).forEach(key => {
+    const filter = sharedStateFilters[key];
+    const { source, property, transform } = filter;
+    let value = nextState[source][property];
+    if (transform) {
+      value = transform(value);
     }
 
-    if (sharedStateCb) {
-      // Pass dispatch to the callback to consumers can dispatch actions in response to preference set
-      sharedStateCb({ dispatch, getState });
-    }
-    clearTimeout(timeout);
-    return actionResult;
+    shared[key] = value;
+  });
+
+  if (!isEqual(oldShared, shared)) {
+    // only update if the preference changed from last call in the same session
+    oldShared = shared;
+    doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION);
   }
-  timeout = setTimeout(runPreferences, RUN_PREFERENCES_DELAY_MS);
+
+  if (sharedStateCb) {
+    // Pass dispatch to the callback to consumers can dispatch actions in response to preference set
+    sharedStateCb({ dispatch, getState });
+  }
+
+  return actionResult;
 };
 
 //      
@@ -2037,7 +1838,7 @@ function doToast(params) {
   return {
     type: CREATE_TOAST,
     data: {
-      id: uuid.v4(),
+      id: uuid(),
       params
     }
   };
@@ -2064,63 +1865,6 @@ function doDismissError() {
   };
 }
 
-// JSON parser
-const parseJson = (data, filters = []) => {
-  const list = data.map(item => {
-    const temp = {};
-    // Apply filters
-    Object.entries(item).forEach(([key, value]) => {
-      if (!filters.includes(key)) temp[key] = value;
-    });
-    return temp;
-  });
-  // Beautify JSON
-  return JSON.stringify(list, null, '\t');
-};
-
-// CSV Parser
-// No need for an external module:
-// https://gist.github.com/btzr-io/55c3450ea3d709fc57540e762899fb85
-const parseCsv = (data, filters = []) => {
-  // Get items for header
-  const getHeaders = item => {
-    const list = [];
-    // Apply filters
-    Object.entries(item).forEach(([key]) => {
-      if (!filters.includes(key)) list.push(key);
-    });
-    // return headers
-    return list.join(',');
-  };
-
-  // Get rows content
-  const getData = list => list.map(item => {
-    const row = [];
-    // Apply filters
-    Object.entries(item).forEach(([key, value]) => {
-      if (!filters.includes(key)) row.push(value);
-    });
-    // return rows
-    return row.join(',');
-  }).join('\n');
-
-  // Return CSV string
-  return `${getHeaders(data[0])} \n ${getData(data)}`;
-};
-
-const parseData = (data, format, filters = []) => {
-  // Check for validation
-  const valid = data && data[0] && format;
-  // Pick a format
-  const formats = {
-    csv: list => parseCsv(list, filters),
-    json: list => parseJson(list, filters)
-  };
-
-  // Return parsed data: JSON || CSV
-  return valid && formats[format] ? formats[format](data) : undefined;
-};
-
 const selectState = state => state.wallet || {};
 
 const selectWalletState = selectState;
@@ -2133,8 +1877,6 @@ const selectWalletEncryptSucceeded = reselect.createSelector(selectState, state
 
 const selectPendingSupportTransactions = reselect.createSelector(selectState, state => state.pendingSupportTransactions);
 
-const selectPendingOtherTransactions = reselect.createSelector(selectState, state => state.pendingTxos);
-
 const selectAbandonClaimSupportError = reselect.createSelector(selectState, state => state.abandonClaimSupportError);
 
 const makeSelectPendingAmountByUri = uri => reselect.createSelector(selectClaimIdsByUri, selectPendingSupportTransactions, (claimIdsByUri, pendingSupports) => {
@@ -2272,24 +2014,6 @@ const selectHasTransactions = reselect.createSelector(selectTransactionItems, tr
 
 const selectIsFetchingTransactions = reselect.createSelector(selectState, state => state.fetchingTransactions);
 
-/**
- * CSV of 'selectTransactionItems'.
- */
-const selectTransactionsFile = reselect.createSelector(selectTransactionItems, transactions => {
-  if (!transactions || transactions.length === 0) {
-    // No data.
-    return undefined;
-  }
-
-  const parsed = parseData(transactions, 'csv');
-  if (!parsed) {
-    // Invalid data, or failed to parse.
-    return null;
-  }
-
-  return parsed;
-});
-
 const selectIsSendingSupport = reselect.createSelector(selectState, state => state.sendingSupport);
 
 const selectReceiveAddress = reselect.createSelector(selectState, state => state.receiveAddress);
@@ -2342,18 +2066,6 @@ const selectFilteredTransactionCount = reselect.createSelector(selectFilteredTra
 
 const selectIsWalletReconnecting = reselect.createSelector(selectState, state => state.walletReconnecting);
 
-const selectIsFetchingUtxoCounts = reselect.createSelector(selectState, state => state.fetchingUtxoCounts);
-
-const selectIsConsolidatingUtxos = reselect.createSelector(selectState, state => state.consolidatingUtxos);
-
-const selectIsMassClaimingTips = reselect.createSelector(selectState, state => state.massClaimingTips);
-
-const selectPendingConsolidateTxid = reselect.createSelector(selectState, state => state.pendingConsolidateTxid);
-
-const selectPendingMassClaimTxid = reselect.createSelector(selectState, state => state.pendingMassClaimTxid);
-
-const selectUtxoCounts = reselect.createSelector(selectState, state => state.utxoCounts);
-
 var _extends$2 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 function _objectWithoutProperties$1(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
@@ -2405,13 +2117,7 @@ var _extends$3 = Object.assign || function (target) { for (var i = 1; i < argume
 
 const selectState$1 = state => state.claims || {};
 
-const selectById = reselect.createSelector(selectState$1, state => state.byId || {});
-
-const selectPendingClaimsById = reselect.createSelector(selectState$1, state => state.pendingById || {});
-
-const selectClaimsById = reselect.createSelector(selectById, selectPendingClaimsById, (byId, pendingById) => {
-  return Object.assign(byId, pendingById); // do I need merged to keep metadata?
-});
+const selectClaimsById = reselect.createSelector(selectState$1, state => state.byId || {});
 
 const selectClaimIdsByUri = reselect.createSelector(selectState$1, state => state.claimsByUri || {});
 
@@ -2446,29 +2152,19 @@ const selectClaimsByUri = reselect.createSelector(selectClaimIdsByUri, selectCla
 
 const selectAllClaimsByChannel = reselect.createSelector(selectState$1, state => state.paginatedClaimsByChannel || {});
 
-const selectPendingIds = reselect.createSelector(selectState$1, state => Object.keys(state.pendingById) || []);
+const selectPendingIds = reselect.createSelector(selectState$1, state => state.pendingIds || []);
 
-const selectPendingClaims = reselect.createSelector(selectPendingClaimsById, pendingById => Object.values(pendingById));
-
-const makeSelectClaimIsPending = uri => reselect.createSelector(selectClaimIdsByUri, selectPendingClaimsById, (idsByUri, pendingById) => {
+const makeSelectClaimIsPending = uri => reselect.createSelector(selectClaimIdsByUri, selectPendingIds, (idsByUri, pendingIds) => {
   const claimId = idsByUri[normalizeURI(uri)];
 
   if (claimId) {
-    return Boolean(pendingById[claimId]);
+    return pendingIds.some(i => i === claimId);
   }
   return false;
 });
 
-const makeSelectClaimIdIsPending = claimId => reselect.createSelector(selectPendingClaimsById, pendingById => {
-  return Boolean(pendingById[claimId]);
-});
-
-const makeSelectClaimIdForUri = uri => reselect.createSelector(selectClaimIdsByUri, claimIds => claimIds[uri]);
-
 const selectReflectingById = reselect.createSelector(selectState$1, state => state.reflectingById);
 
-const makeSelectClaimForClaimId = claimId => reselect.createSelector(selectClaimsById, byId => byId[claimId]);
-
 const makeSelectClaimForUri = (uri, returnRepost = true) => reselect.createSelector(selectClaimIdsByUri, selectClaimsById, (byUri, byId) => {
   let validUri;
   let channelClaimId;
@@ -2490,14 +2186,13 @@ const makeSelectClaimForUri = (uri, returnRepost = true) => reselect.createSelec
       return undefined;
     }
 
-    const repostedClaim = claim && claim.reposted_claim;
+    const repostedClaim = claim.reposted_claim;
     if (repostedClaim && returnRepost) {
-      const channelUrl = claim.signing_channel && (claim.signing_channel.canonical_url || claim.signing_channel.permanent_url);
+      const channelUrl = claim.signing_channel && claim.signing_channel.canonical_url;
 
       return _extends$3({}, repostedClaim, {
-        repost_url: normalizeURI(uri),
-        repost_channel_url: channelUrl,
-        repost_bid_amount: claim && claim.meta && claim.meta.effective_amount
+        repost_url: uri,
+        repost_channel_url: channelUrl
       });
     } else {
       return claim;
@@ -2593,18 +2288,25 @@ const makeSelectClaimsInChannelForPage = (uri, page) => reselect.createSelector(
   return claimIds.map(claimId => byId[claimId]);
 });
 
-// THIS IS LEFT OVER FROM ONE TAB CHANNEL_CONTENT
 const makeSelectTotalClaimsInChannelSearch = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, (byId, allClaims) => {
   const byChannel = allClaims[uri] || {};
   return byChannel['itemCount'];
 });
 
-// THIS IS LEFT OVER FROM ONE_TAB CHANNEL CONTENT
 const makeSelectTotalPagesInChannelSearch = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, (byId, allClaims) => {
   const byChannel = allClaims[uri] || {};
   return byChannel['pageCount'];
 });
 
+const makeSelectClaimsInChannelForCurrentPageState = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, selectCurrentChannelPage, (byId, allClaims, page) => {
+  const byChannel = allClaims[uri] || {};
+  const claimIds = byChannel[page || 1];
+
+  if (!claimIds) return claimIds;
+
+  return claimIds.map(claimId => byId[claimId]);
+});
+
 const makeSelectMetadataForUri = uri => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
   const metadata = claim && claim.value;
   return metadata || (claim === undefined ? undefined : null);
@@ -2629,10 +2331,6 @@ const makeSelectAmountForUri = uri => reselect.createSelector(makeSelectClaimFor
   return claim && claim.amount;
 });
 
-const makeSelectEffectiveAmountForUri = uri => reselect.createSelector(makeSelectClaimForUri(uri, false), claim => {
-  return claim && claim.meta && typeof claim.meta.effective_amount === 'string' && Number(claim.meta.effective_amount);
-});
-
 const makeSelectContentTypeForUri = uri => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
   const source = claim && claim.value && claim.value.source;
   return source ? source.media_type : undefined;
@@ -2670,7 +2368,7 @@ const selectMyClaims = reselect.createSelector(selectMyActiveClaims, selectClaim
   return [...claims];
 });
 
-const selectMyClaimsWithoutChannels = reselect.createSelector(selectMyClaims, myClaims => myClaims.filter(claim => claim && !claim.name.match(/^@/)).sort((a, b) => a.timestamp - b.timestamp));
+const selectMyClaimsWithoutChannels = reselect.createSelector(selectMyClaims, myClaims => myClaims.filter(claim => !claim.name.match(/^@/)).sort((a, b) => a.timestamp - b.timestamp));
 
 const selectMyClaimUrisWithoutChannels = reselect.createSelector(selectMyClaimsWithoutChannels, myClaims => {
   return myClaims.sort((a, b) => {
@@ -2698,8 +2396,6 @@ const selectMyClaimsOutpoints = reselect.createSelector(selectMyClaims, myClaims
 
 const selectFetchingMyChannels = reselect.createSelector(selectState$1, state => state.fetchingMyChannels);
 
-const selectFetchingMyCollections = reselect.createSelector(selectState$1, state => state.fetchingMyCollections);
-
 const selectMyChannelClaims = reselect.createSelector(selectState$1, selectClaimsById, (state, byId) => {
   const ids = state.myChannelClaims;
   if (!ids) {
@@ -2719,8 +2415,6 @@ const selectMyChannelClaims = reselect.createSelector(selectState$1, selectClaim
 
 const selectMyChannelUrls = reselect.createSelector(selectMyChannelClaims, claims => claims ? claims.map(claim => claim.canonical_url || claim.permanent_url) : undefined);
 
-const selectMyCollectionIds = reselect.createSelector(selectState$1, state => state.myCollectionClaims);
-
 const selectResolvingUris = reselect.createSelector(selectState$1, state => state.resolvingUris || []);
 
 const selectChannelImportPending = reselect.createSelector(selectState$1, state => state.pendingChannelImport);
@@ -2731,24 +2425,9 @@ const selectPlayingUri = reselect.createSelector(selectState$1, state => state.p
 
 const selectChannelClaimCounts = reselect.createSelector(selectState$1, state => state.channelClaimCounts || {});
 
-const makeSelectPendingClaimForUri = uri => reselect.createSelector(selectPendingClaimsById, pendingById => {
-  let uriStreamName;
-  let uriChannelName;
-  try {
-    ({ streamName: uriStreamName, channelName: uriChannelName } = parseURI(uri));
-  } catch (e) {
-    return null;
-  }
-  const pendingClaims = Object.values(pendingById);
-  const matchingClaim = pendingClaims.find(claim => {
-    return claim.normalized_name === uriChannelName || claim.normalized_name === uriStreamName;
-  });
-  return matchingClaim || null;
-});
+const makeSelectTotalItemsForChannel = uri => reselect.createSelector(selectChannelClaimCounts, byUri => byUri && byUri[uri]);
 
-const makeSelectTotalItemsForChannel = uri => reselect.createSelector(selectChannelClaimCounts, byUri => byUri && byUri[normalizeURI(uri)]);
-
-const makeSelectTotalPagesForChannel = (uri, pageSize = 10) => reselect.createSelector(selectChannelClaimCounts, byUri => byUri && byUri[uri] && Math.ceil(byUri[normalizeURI(uri)] / pageSize));
+const makeSelectTotalPagesForChannel = (uri, pageSize = 10) => reselect.createSelector(selectChannelClaimCounts, byUri => byUri && byUri[uri] && Math.ceil(byUri[uri] / pageSize));
 
 const makeSelectNsfwCountFromUris = uris => reselect.createSelector(selectClaimsByUri, claims => uris.reduce((acc, uri) => {
   const claim = claims[uri];
@@ -2758,6 +2437,21 @@ const makeSelectNsfwCountFromUris = uris => reselect.createSelector(selectClaims
   return acc;
 }, 0));
 
+const makeSelectNsfwCountForChannel = uri => reselect.createSelector(selectClaimsById, selectAllClaimsByChannel, selectCurrentChannelPage, (byId, allClaims, page) => {
+  const byChannel = allClaims[uri] || {};
+  const claimIds = byChannel[page || 1];
+
+  if (!claimIds) return 0;
+
+  return claimIds.reduce((acc, claimId) => {
+    const claim = byId[claimId];
+    if (isClaimNsfw(claim)) {
+      return acc + 1;
+    }
+    return acc;
+  }, 0);
+});
+
 const makeSelectOmittedCountForChannel = uri => reselect.createSelector(makeSelectTotalItemsForChannel(uri), makeSelectTotalClaimsInChannelSearch(uri), (claimsInChannel, claimsInSearch) => {
   if (claimsInChannel && typeof claimsInSearch === 'number' && claimsInSearch >= 0) {
     return claimsInChannel - claimsInSearch;
@@ -2794,21 +2488,6 @@ const makeSelectChannelForClaimUri = (uri, includePrefix = false) => reselect.cr
   }
 });
 
-const makeSelectChannelPermUrlForClaimUri = (uri, includePrefix = false) => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
-  if (claim && claim.value_type === 'channel') {
-    return claim.permanent_url;
-  }
-  if (!claim || !claim.signing_channel || !claim.is_channel_signature_valid) {
-    return null;
-  }
-  return claim.signing_channel.permanent_url;
-});
-
-const makeSelectMyChannelPermUrlForName = name => reselect.createSelector(selectMyChannelClaims, claims => {
-  const matchingClaim = claims && claims.find(claim => claim.name === name);
-  return matchingClaim ? matchingClaim.permanent_url : null;
-});
-
 const makeSelectTagsForUri = uri => reselect.createSelector(makeSelectMetadataForUri(uri), metadata => {
   return metadata && metadata.tags || [];
 });
@@ -2862,63 +2541,6 @@ const makeSelectMyStreamUrlsForPage = (page = 1) => reselect.createSelector(sele
 
 const selectMyStreamUrlsCount = reselect.createSelector(selectMyClaimUrisWithoutChannels, channels => channels.length);
 
-const makeSelectTagInClaimOrChannelForUri = (uri, tag) => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
-  const claimTags = claim && claim.value && claim.value.tags || [];
-  const channelTags = claim && claim.signing_channel && claim.signing_channel.value && claim.signing_channel.value.tags || [];
-  return claimTags.includes(tag) || channelTags.includes(tag);
-});
-
-const makeSelectClaimHasSource = uri => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
-  if (!claim) {
-    return false;
-  }
-
-  return Boolean(claim.value.source);
-});
-
-const makeSelectClaimIsStreamPlaceholder = uri => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
-  if (!claim) {
-    return false;
-  }
-
-  return Boolean(claim.value_type === 'stream' && !claim.value.source);
-});
-
-const makeSelectTotalStakedAmountForChannelUri = uri => reselect.createSelector(makeSelectClaimForUri(uri), claim => {
-  if (!claim || !claim.amount || !claim.meta || !claim.meta.support_amount) {
-    return 0;
-  }
-
-  return parseFloat(claim.amount) + parseFloat(claim.meta.support_amount) || 0;
-});
-
-const makeSelectStakedLevelForChannelUri = uri => reselect.createSelector(makeSelectTotalStakedAmountForChannelUri(uri), amount => {
-  let level = 1;
-  switch (true) {
-    case amount >= LEVEL_2_STAKED_AMOUNT && amount < LEVEL_3_STAKED_AMOUNT:
-      level = 2;
-      break;
-    case amount >= LEVEL_3_STAKED_AMOUNT && amount < LEVEL_4_STAKED_AMOUNT:
-      level = 3;
-      break;
-    case amount >= LEVEL_4_STAKED_AMOUNT && amount < LEVEL_5_STAKED_AMOUNT:
-      level = 4;
-      break;
-    case amount >= LEVEL_5_STAKED_AMOUNT:
-      level = 5;
-      break;
-  }
-  return level;
-});
-
-const selectUpdatingCollection = reselect.createSelector(selectState$1, state => state.updatingCollection);
-
-const selectUpdateCollectionError = reselect.createSelector(selectState$1, state => state.updateCollectionError);
-
-const selectCreatingCollection = reselect.createSelector(selectState$1, state => state.creatingCollection);
-
-const selectCreateCollectionError = reselect.createSelector(selectState$1, state => state.createCollectionError);
-
 function numberWithCommas(x) {
   var parts = x.toString().split('.');
   parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
@@ -2980,11 +2602,8 @@ function creditsToString(amount) {
 
 var _extends$4 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
 const FIFTEEN_SECONDS = 15000;
 let walletBalancePromise = null;
-
 function doUpdateBalance() {
   return (dispatch, getState) => {
     const {
@@ -3024,12 +2643,13 @@ function doUpdateBalance() {
 function doBalanceSubscribe() {
   return dispatch => {
     dispatch(doUpdateBalance());
-    setInterval(() => dispatch(doUpdateBalance()), 10000);
+    setInterval(() => dispatch(doUpdateBalance()), 5000);
   };
 }
 
-function doFetchTransactions(page = 1, pageSize = 999999) {
+function doFetchTransactions(page = 1, pageSize = 99999) {
   return dispatch => {
+    dispatch(doFetchSupports());
     dispatch({
       type: FETCH_TRANSACTIONS_STARTED
     });
@@ -3047,54 +2667,22 @@ function doFetchTransactions(page = 1, pageSize = 999999) {
 
 function doFetchTxoPage() {
   return (dispatch, getState) => {
-    const fetchId = Math.random().toString(36).substr(2, 9);
-
     dispatch({
-      type: FETCH_TXO_PAGE_STARTED,
-      data: fetchId
+      type: FETCH_TXO_PAGE_STARTED
     });
 
     const state = getState();
     const queryParams = selectTxoPageParams(state);
 
     lbryProxy.txo_list(queryParams).then(res => {
-      const items = res.items || [];
-      const claimsById = selectClaimsById(state);
-
-      const channelIds = items.reduce((acc, cur) => {
-        if (cur.type === 'support' && cur.signing_channel && !claimsById[cur.signing_channel.channel_id]) {
-          acc.push(cur.signing_channel.channel_id);
-        }
-        return acc;
-      }, []);
-
-      if (channelIds.length) {
-        const searchParams = {
-          page_size: 9999,
-          page: 1,
-          no_totals: true,
-          claim_ids: channelIds
-        };
-        // make sure redux has these channels resolved
-        dispatch(doClaimSearch(searchParams));
-      }
-
-      return res;
-    }).then(res => {
       dispatch({
         type: FETCH_TXO_PAGE_COMPLETED,
-        data: {
-          result: res,
-          fetchId: fetchId
-        }
+        data: res
       });
     }).catch(e => {
       dispatch({
         type: FETCH_TXO_PAGE_COMPLETED,
-        data: {
-          error: e.message,
-          fetchId: fetchId
-        }
+        data: e.message
       });
     });
   };
@@ -3111,87 +2699,21 @@ function doUpdateTxoPageParams(params) {
   };
 }
 
-function doFetchUtxoCounts() {
-  return (() => {
-    var _ref = _asyncToGenerator(function* (dispatch) {
-      dispatch({
-        type: FETCH_UTXO_COUNT_STARTED
-      });
-
-      let resultSets = yield Promise.all([lbryProxy.txo_list({ type: 'other', is_not_spent: true, page: 1, page_size: 1 }), lbryProxy.txo_list({ type: 'support', is_not_spent: true, page: 1, page_size: 1 })]);
-      const counts = {};
-      const paymentCount = resultSets[0]['total_items'];
-      const supportCount = resultSets[1]['total_items'];
-      counts['other'] = typeof paymentCount === 'number' ? paymentCount : 0;
-      counts['support'] = typeof supportCount === 'number' ? supportCount : 0;
-
-      dispatch({
-        type: FETCH_UTXO_COUNT_COMPLETED,
-        data: counts,
-        debug: { resultSets }
-      });
+function doFetchSupports(page = 1, pageSize = 99999) {
+  return dispatch => {
+    dispatch({
+      type: FETCH_SUPPORTS_STARTED
     });
 
-    return function (_x) {
-      return _ref.apply(this, arguments);
-    };
-  })();
-}
-
-function doUtxoConsolidate() {
-  return (() => {
-    var _ref2 = _asyncToGenerator(function* (dispatch) {
+    lbryProxy.support_list({ page, page_size: pageSize }).then(result => {
       dispatch({
-        type: DO_UTXO_CONSOLIDATE_STARTED
+        type: FETCH_SUPPORTS_COMPLETED,
+        data: {
+          supports: result.items
+        }
       });
-
-      const results = yield lbryProxy.txo_spend({ type: 'other' });
-      const result = results[0];
-
-      dispatch({
-        type: PENDING_CONSOLIDATED_TXOS_UPDATED,
-        data: { txids: [result.txid] }
-      });
-
-      dispatch({
-        type: DO_UTXO_CONSOLIDATE_COMPLETED,
-        data: { txid: result.txid }
-      });
-      dispatch(doCheckPendingTxs());
     });
-
-    return function (_x2) {
-      return _ref2.apply(this, arguments);
-    };
-  })();
-}
-
-function doTipClaimMass() {
-  return (() => {
-    var _ref3 = _asyncToGenerator(function* (dispatch) {
-      dispatch({
-        type: TIP_CLAIM_MASS_STARTED
-      });
-
-      const results = yield lbryProxy.txo_spend({ type: 'support', is_not_my_input: true });
-      const result = results[0];
-
-      dispatch({
-        type: PENDING_CONSOLIDATED_TXOS_UPDATED,
-        data: { txids: [result.txid] }
-      });
-
-      dispatch({
-        type: TIP_CLAIM_MASS_COMPLETED,
-        data: { txid: result.txid }
-      });
-      dispatch(doCheckPendingTxs());
-    });
-
-    return function (_x3) {
-      return _ref3.apply(this, arguments);
-    };
-  })();
+  };
 }
 
 function doGetNewAddress() {
@@ -3248,7 +2770,7 @@ function doSendDraftTransaction(address, amount) {
           type: SEND_TRANSACTION_COMPLETED
         });
         dispatch(doToast({
-          message: __('You sent %amount% LBRY Credits', { amount: amount }),
+          message: __(`You sent ${amount} LBC`),
           linkText: __('History'),
           linkTarget: '/wallet'
         }));
@@ -3296,7 +2818,7 @@ function doSetDraftTransactionAddress(address) {
   };
 }
 
-function doSendTip(params, isSupport, successCallback, errorCallback, shouldNotify = true) {
+function doSendTip(params, isSupport, successCallback, errorCallback) {
   return (dispatch, getState) => {
     const state = getState();
     const balance = selectBalance(state);
@@ -3312,21 +2834,19 @@ function doSendTip(params, isSupport, successCallback, errorCallback, shouldNoti
       return;
     }
 
-    const success = response => {
-      if (shouldNotify) {
-        dispatch(doToast({
-          message: shouldSupport ? __('You deposited %amount% LBRY Credits as a support!', { amount: params.amount }) : __('You sent %amount% LBRY Credits as a tip, Mahalo!', { amount: params.amount }),
-          linkText: __('History'),
-          linkTarget: '/wallet'
-        }));
-      }
+    const success = () => {
+      dispatch(doToast({
+        message: shouldSupport ? __('You deposited %amount% LBC as a support!', { amount: params.amount }) : __('You sent %amount% LBC as a tip, Mahalo!', { amount: params.amount }),
+        linkText: __('History'),
+        linkTarget: '/wallet'
+      }));
 
       dispatch({
         type: SUPPORT_TRANSACTION_COMPLETED
       });
 
       if (successCallback) {
-        successCallback(response);
+        successCallback();
       }
     };
 
@@ -3410,7 +2930,6 @@ function doWalletUnlock(password) {
   };
 }
 
-// Collect all tips for a claim
 function doSupportAbandonForClaim(claimId, claimType, keep, preview) {
   return dispatch => {
     if (preview) {
@@ -3430,7 +2949,7 @@ function doSupportAbandonForClaim(claimId, claimType, keep, preview) {
       if (!preview) {
         dispatch({
           type: ABANDON_CLAIM_SUPPORT_COMPLETED,
-          data: { claimId, txid: res.txid, effective: res.outputs[0].amount, type: claimType }
+          data: { claimId, txid: res.txid, effective: res.outputs[0].amount, type: claimType } // add to pendingSupportTransactions,
         });
         dispatch(doCheckPendingTxs());
       }
@@ -3468,7 +2987,6 @@ function doWalletReconnect() {
     });
   };
 }
-
 function doWalletDecrypt() {
   return dispatch => {
     dispatch({
@@ -3530,50 +3048,33 @@ function doUpdateBlockHeight() {
 const doCheckPendingTxs = () => (dispatch, getState) => {
   const state = getState();
   const pendingTxsById = selectPendingSupportTransactions(state); // {}
-  const pendingOtherTxes = selectPendingOtherTransactions(state);
-
-  if (!Object.keys(pendingTxsById).length && !pendingOtherTxes.length) {
+  if (!Object.keys(pendingTxsById).length) {
     return;
   }
   let txCheckInterval;
   const checkTxList = () => {
     const state = getState();
-    const pendingSupportTxs = selectPendingSupportTransactions(state); // {}
-    const pendingConsolidateTxes = selectPendingOtherTransactions(state);
-    const pendingConsTxid = selectPendingConsolidateTxid(state);
-    const pendingMassCLaimTxid = selectPendingMassClaimTxid(state);
-
+    const pendingTxs = selectPendingSupportTransactions(state); // {}
     const promises = [];
     const newPendingTxes = {};
-    const noLongerPendingConsolidate = [];
     const types = new Set([]);
-    // { claimId: {txid: 123, amount 12.3}, }
-    const entries = Object.entries(pendingSupportTxs);
-    entries.forEach(([claim, data]) => {
+    let changed = false;
+    Object.entries(pendingTxs).forEach(([claim, data]) => {
       promises.push(lbryProxy.transaction_show({ txid: data.txid }));
       types.add(data.type);
     });
-    if (pendingConsolidateTxes.length) {
-      pendingConsolidateTxes.forEach(txid => promises.push(lbryProxy.transaction_show({ txid })));
-    }
 
     Promise.all(promises).then(txShows => {
-      let changed = false;
       txShows.forEach(result => {
-        if (pendingConsolidateTxes.includes(result.txid)) {
-          if (result.height > 0) {
-            noLongerPendingConsolidate.push(result.txid);
-          }
+        if (result.height <= 0) {
+          const entries = Object.entries(pendingTxs);
+          const match = entries.find(entry => entry[1].txid === result.txid);
+          newPendingTxes[match[0]] = match[1];
         } else {
-          if (result.height <= 0) {
-            const match = entries.find(entry => entry[1].txid === result.txid);
-            newPendingTxes[match[0]] = match[1];
-          } else {
-            changed = true;
-          }
+          changed = true;
         }
       });
-
+    }).then(() => {
       if (changed) {
         dispatch({
           type: PENDING_SUPPORTS_UPDATED,
@@ -3586,27 +3087,12 @@ const doCheckPendingTxs = () => (dispatch, getState) => {
           dispatch(doFetchClaimListMine());
         }
       }
-      if (noLongerPendingConsolidate.length) {
-        if (noLongerPendingConsolidate.includes(pendingConsTxid)) {
-          dispatch(doToast({
-            message: __('Your wallet is finished consolidating')
-          }));
-        }
-        if (noLongerPendingConsolidate.includes(pendingMassCLaimTxid)) {
-          dispatch(doToast({
-            message: __('Your tips have been collected')
-          }));
-        }
-        dispatch({
-          type: PENDING_CONSOLIDATED_TXOS_UPDATED,
-          data: { txids: noLongerPendingConsolidate, remove: true }
-        });
-      }
-
-      if (!Object.keys(pendingTxsById).length && !pendingOtherTxes.length) {
-        clearInterval(txCheckInterval);
-      }
+      if (Object.keys(newPendingTxes).length === 0) clearInterval(txCheckInterval);
     });
+
+    if (!Object.keys(pendingTxsById).length) {
+      clearInterval(txCheckInterval);
+    }
   };
 
   txCheckInterval = setInterval(() => {
@@ -3622,193 +3108,9 @@ function batchActions(...actions) {
   };
 }
 
-//      
-
-const selectState$2 = state => state.collections;
-
-const selectSavedCollectionIds = reselect.createSelector(selectState$2, collectionState => collectionState.saved);
-
-const selectBuiltinCollections = reselect.createSelector(selectState$2, state => state.builtin);
-const selectResolvedCollections = reselect.createSelector(selectState$2, state => state.resolved);
-
-const selectMyUnpublishedCollections = reselect.createSelector(selectState$2, state => state.unpublished);
-
-const selectMyEditedCollections = reselect.createSelector(selectState$2, state => state.edited);
-
-const selectPendingCollections = reselect.createSelector(selectState$2, state => state.pending);
-
-const makeSelectEditedCollectionForId = id => reselect.createSelector(selectMyEditedCollections, eLists => eLists[id]);
-
-const makeSelectPendingCollectionForId = id => reselect.createSelector(selectPendingCollections, pending => pending[id]);
-
-const makeSelectPublishedCollectionForId = id => reselect.createSelector(selectResolvedCollections, rLists => rLists[id]);
-
-const makeSelectUnpublishedCollectionForId = id => reselect.createSelector(selectMyUnpublishedCollections, rLists => rLists[id]);
-
-const makeSelectCollectionIsMine = id => reselect.createSelector(selectMyCollectionIds, selectMyUnpublishedCollections, selectBuiltinCollections, (publicIds, privateIds, builtinIds) => {
-  return Boolean(publicIds.includes(id) || privateIds[id] || builtinIds[id]);
-});
-
-const selectMyPublishedCollections = reselect.createSelector(selectResolvedCollections, selectPendingCollections, selectMyEditedCollections, selectMyCollectionIds, (resolved, pending, edited, myIds) => {
-  // all resolved in myIds, plus those in pending and edited
-  const myPublishedCollections = fromEntries(Object.entries(pending).concat(Object.entries(resolved).filter(([key, val]) => myIds.includes(key) &&
-  // $FlowFixMe
-  !pending[key])));
-  // now add in edited:
-  Object.entries(edited).forEach(([id, item]) => {
-    myPublishedCollections[id] = item;
-  });
-  return myPublishedCollections;
-});
-
-const selectMyPublishedMixedCollections = reselect.createSelector(selectMyPublishedCollections, published => {
-  const myCollections = fromEntries(
-  // $FlowFixMe
-  Object.entries(published).filter(([key, collection]) => {
-    // $FlowFixMe
-    return collection.type === 'collection';
-  }));
-  return myCollections;
-});
-
-const selectMyPublishedPlaylistCollections = reselect.createSelector(selectMyPublishedCollections, published => {
-  const myCollections = fromEntries(
-  // $FlowFixMe
-  Object.entries(published).filter(([key, collection]) => {
-    // $FlowFixMe
-    return collection.type === 'playlist';
-  }));
-  return myCollections;
-});
-
-const makeSelectMyPublishedCollectionForId = id => reselect.createSelector(selectMyPublishedCollections, myPublishedCollections => myPublishedCollections[id]);
-
-// export const selectSavedCollections = createSelector(
-//   selectResolvedCollections,
-//   selectSavedCollectionIds,
-//   (resolved, myIds) => {
-//     const mySavedCollections = fromEntries(
-//       Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
-//     );
-//     return mySavedCollections;
-//   }
-// );
-
-const makeSelectIsResolvingCollectionForId = id => reselect.createSelector(selectState$2, state => {
-  return state.isResolvingCollectionById[id];
-});
-
-const makeSelectCollectionForId = id => reselect.createSelector(selectBuiltinCollections, selectResolvedCollections, selectMyUnpublishedCollections, selectMyEditedCollections, selectPendingCollections, (bLists, rLists, uLists, eLists, pLists) => {
-  const collection = bLists[id] || uLists[id] || eLists[id] || pLists[id] || rLists[id];
-  return collection;
-});
-
-const makeSelectClaimUrlInCollection = url => reselect.createSelector(selectBuiltinCollections, selectMyPublishedCollections, selectMyUnpublishedCollections, selectMyEditedCollections, selectPendingCollections, (bLists, myRLists, uLists, eLists, pLists) => {
-  const collections = [bLists, uLists, eLists, myRLists, pLists];
-  const itemsInCollections = [];
-  collections.map(list => {
-    Object.entries(list).forEach(([key, value]) => {
-      // $FlowFixMe
-      value.items.map(item => {
-        itemsInCollections.push(item);
-      });
-    });
-  });
-  return itemsInCollections.includes(url);
-});
-
-const makeSelectCollectionForIdHasClaimUrl = (id, url) => reselect.createSelector(makeSelectCollectionForId(id), collection => collection && collection.items.includes(url));
-
-const makeSelectUrlsForCollectionId = id => reselect.createSelector(makeSelectCollectionForId(id), collection => collection && collection.items);
-
-const makeSelectClaimIdsForCollectionId = id => reselect.createSelector(makeSelectCollectionForId(id), collection => {
-  const items = collection && collection.items || [];
-  const ids = items.map(item => {
-    const { claimId } = parseURI(item);
-    return claimId;
-  });
-  return ids;
-});
-
-const makeSelectIndexForUrlInCollection = (url, id) => reselect.createSelector(state => state.content.shuffleList, makeSelectUrlsForCollectionId(id), makeSelectClaimForUri(url), (shuffleState, urls, claim) => {
-  const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
-  const listUrls = shuffleUrls || urls;
-
-  const index = listUrls && listUrls.findIndex(u => u === url);
-  if (index > -1) {
-    return index;
-  } else if (claim) {
-    const index = listUrls && listUrls.findIndex(u => u === claim.permanent_url);
-    if (index > -1) return index;
-    return claim;
-  }
-  return null;
-});
-
-const makeSelectPreviousUrlForCollectionAndUrl = (id, url) => reselect.createSelector(state => state.content.shuffleList, state => state.content.loopList, makeSelectIndexForUrlInCollection(url, id), makeSelectUrlsForCollectionId(id), (shuffleState, loopState, index, urls) => {
-  const loopList = loopState && loopState.collectionId === id && loopState.loop;
-  const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
-
-  if (index > -1) {
-    const listUrls = shuffleUrls || urls;
-    let nextUrl;
-    if (index === 0 && loopList) {
-      nextUrl = listUrls[listUrls.length - 1];
-    } else {
-      nextUrl = listUrls[index - 1];
-    }
-    return nextUrl || null;
-  } else {
-    return null;
-  }
-});
-
-const makeSelectNextUrlForCollectionAndUrl = (id, url) => reselect.createSelector(state => state.content.shuffleList, state => state.content.loopList, makeSelectIndexForUrlInCollection(url, id), makeSelectUrlsForCollectionId(id), (shuffleState, loopState, index, urls) => {
-  const loopList = loopState && loopState.collectionId === id && loopState.loop;
-  const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
-
-  if (index > -1) {
-    const listUrls = shuffleUrls || urls;
-    // We'll get the next playble url
-    let remainingUrls = listUrls.slice(index + 1);
-    if (!remainingUrls.length && loopList) {
-      remainingUrls = listUrls.slice(0);
-    }
-    const nextUrl = remainingUrls && remainingUrls[0];
-    return nextUrl || null;
-  } else {
-    return null;
-  }
-});
-
-const makeSelectNameForCollectionId = id => reselect.createSelector(makeSelectCollectionForId(id), collection => {
-  return collection && collection.name || '';
-});
-
-const makeSelectCountForCollectionId = id => reselect.createSelector(makeSelectCollectionForId(id), collection => {
-  if (collection) {
-    if (collection.itemCount !== undefined) {
-      return collection.itemCount;
-    }
-    let itemCount = 0;
-    collection.items.map(item => {
-      if (item) {
-        itemCount += 1;
-      }
-    });
-    return itemCount;
-  }
-  return null;
-});
-
 var _extends$5 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-function _asyncToGenerator$1(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-let onChannelConfirmCallback;
-let checkPendingInterval;
-
-function doResolveUris(uris, returnCachedClaims = false, resolveReposts = true) {
+function doResolveUris(uris, returnCachedClaims = false) {
   return (dispatch, getState) => {
     const normalizedUris = uris.map(normalizeURI);
     const state = getState();
@@ -3841,85 +3143,44 @@ function doResolveUris(uris, returnCachedClaims = false, resolveReposts = true)
 
     const resolveInfo = {};
 
-    const collectionIds = [];
-
-    return lbryProxy.resolve(_extends$5({ urls: urisToResolve }, options)).then((() => {
-      var _ref = _asyncToGenerator$1(function* (result) {
-        let repostedResults = {};
-        const repostsToResolve = [];
+    return lbryProxy.resolve(_extends$5({ urls: urisToResolve }, options)).then(result => {
+      Object.entries(result).forEach(([uri, uriResolveInfo]) => {
         const fallbackResolveInfo = {
           stream: null,
           claimsInChannel: null,
           channel: null
         };
 
-        function processResult(result, resolveInfo = {}, checkReposts = false) {
-          Object.entries(result).forEach(([uri, uriResolveInfo]) => {
-            // Flow has terrible Object.entries support
-            // https://github.com/facebook/flow/issues/2221
-            if (uriResolveInfo) {
-              if (uriResolveInfo.error) {
-                // $FlowFixMe
-                resolveInfo[uri] = _extends$5({}, fallbackResolveInfo);
-              } else {
-                if (checkReposts) {
-                  if (uriResolveInfo.reposted_claim) {
-                    // $FlowFixMe
-                    const repostUrl = uriResolveInfo.reposted_claim.permanent_url;
-                    if (!resolvingUris.includes(repostUrl)) {
-                      repostsToResolve.push(repostUrl);
-                    }
-                  }
-                }
-                let result = {};
-                if (uriResolveInfo.value_type === 'channel') {
-                  result.channel = uriResolveInfo;
-                  // $FlowFixMe
-                  result.claimsInChannel = uriResolveInfo.meta.claims_in_channel;
-                } else if (uriResolveInfo.value_type === 'collection') {
-                  result.collection = uriResolveInfo;
-                  // $FlowFixMe
-                  collectionIds.push(uriResolveInfo.claim_id);
-                } else {
-                  result.stream = uriResolveInfo;
-                  if (uriResolveInfo.signing_channel) {
-                    result.channel = uriResolveInfo.signing_channel;
-                    result.claimsInChannel = uriResolveInfo.signing_channel.meta && uriResolveInfo.signing_channel.meta.claims_in_channel || 0;
-                  }
-                }
-                // $FlowFixMe
-                resolveInfo[uri] = result;
+        // Flow has terrible Object.entries support
+        // https://github.com/facebook/flow/issues/2221
+        if (uriResolveInfo) {
+          if (uriResolveInfo.error) {
+            resolveInfo[uri] = _extends$5({}, fallbackResolveInfo);
+          } else {
+            let result = {};
+            if (uriResolveInfo.value_type === 'channel') {
+              result.channel = uriResolveInfo;
+              // $FlowFixMe
+              result.claimsInChannel = uriResolveInfo.meta.claims_in_channel;
+            } else {
+              result.stream = uriResolveInfo;
+              if (uriResolveInfo.signing_channel) {
+                result.channel = uriResolveInfo.signing_channel;
+                result.claimsInChannel = uriResolveInfo.signing_channel.meta && uriResolveInfo.signing_channel.meta.claims_in_channel || 0;
               }
             }
-          });
+            // $FlowFixMe
+            resolveInfo[uri] = result;
+          }
         }
-        processResult(result, resolveInfo, resolveReposts);
-
-        if (repostsToResolve.length) {
-          dispatch({
-            type: RESOLVE_URIS_STARTED,
-            data: { uris: repostsToResolve, debug: 'reposts' }
-          });
-          repostedResults = yield lbryProxy.resolve(_extends$5({ urls: repostsToResolve }, options));
-        }
-        processResult(repostedResults, resolveInfo);
-
-        dispatch({
-          type: RESOLVE_URIS_COMPLETED,
-          data: { resolveInfo }
-        });
-
-        if (collectionIds.length) {
-          dispatch(doFetchItemsInCollections({ collectionIds: collectionIds, pageSize: 5 }));
-        }
-
-        return result;
       });
 
-      return function (_x) {
-        return _ref.apply(this, arguments);
-      };
-    })());
+      dispatch({
+        type: RESOLVE_URIS_COMPLETED,
+        data: { resolveInfo }
+      });
+      return result;
+    });
   };
 }
 
@@ -3927,22 +3188,17 @@ function doResolveUri(uri) {
   return doResolveUris([uri]);
 }
 
-function doFetchClaimListMine(page = 1, pageSize = 99999, resolve = true, filterBy = []) {
+function doFetchClaimListMine(page = 1, pageSize = 99999, resolve = true) {
   return dispatch => {
     dispatch({
       type: FETCH_CLAIM_LIST_MINE_STARTED
     });
 
-    let claimTypes = ['stream', 'repost'];
-    if (filterBy && filterBy.length !== 0) {
-      claimTypes = claimTypes.filter(t => filterBy.includes(t));
-    }
-
     // $FlowFixMe
     lbryProxy.claim_list({
       page: page,
       page_size: pageSize,
-      claim_type: claimTypes,
+      claim_type: ['stream', 'repost'],
       resolve
     }).then(result => {
       dispatch({
@@ -4146,7 +3402,7 @@ function doClearChannelErrors() {
   };
 }
 
-function doCreateChannel(name, amount, optionalParams, onConfirm) {
+function doCreateChannel(name, amount, optionalParams, cb) {
   return dispatch => {
     dispatch({
       type: CREATE_CHANNEL_STARTED
@@ -4180,9 +3436,6 @@ function doCreateChannel(name, amount, optionalParams, onConfirm) {
       if (optionalParams.tags) {
         createParams.tags = optionalParams.tags.map(tag => tag.name);
       }
-      if (optionalParams.languages) {
-        createParams.languages = optionalParams.languages;
-      }
     }
 
     return lbryProxy.channel_create(createParams)
@@ -4200,7 +3453,7 @@ function doCreateChannel(name, amount, optionalParams, onConfirm) {
           claims: [channelClaim]
         }
       });
-      dispatch(doCheckPendingClaims(onConfirm));
+      dispatch(doCheckPendingClaims(cb));
       return channelClaim;
     }).catch(error => {
       dispatch({
@@ -4231,7 +3484,7 @@ function doUpdateChannel(params, cb) {
       email: params.email,
       tags: [],
       replace: true,
-      languages: params.languages || [],
+      languages: [],
       locations: [],
       blocking: true
     };
@@ -4241,10 +3494,15 @@ function doUpdateChannel(params, cb) {
     }
 
     // we'll need to remove these once we add locations/channels to channel page edit/create options
+
     if (channelClaim && channelClaim.value && channelClaim.value.locations) {
       updateParams.locations = channelClaim.value.locations;
     }
 
+    if (channelClaim && channelClaim.value && channelClaim.value.languages) {
+      updateParams.languages = channelClaim.value.languages;
+    }
+
     return lbryProxy.channel_update(updateParams).then(result => {
       const channelClaim = result.outputs[0];
       dispatch({
@@ -4274,7 +3532,7 @@ function doImportChannel(certificate) {
       type: IMPORT_CHANNEL_STARTED
     });
 
-    return lbryProxy.channel_import({ channel_data: certificate }).then(() => {
+    return lbryProxy.channel_import({ channel_data: certificate }).then(result => {
       dispatch({
         type: IMPORT_CHANNEL_COMPLETED
       });
@@ -4311,91 +3569,55 @@ function doFetchChannelListMine(page = 1, pageSize = 99999, resolve = true) {
   };
 }
 
-function doFetchCollectionListMine(page = 1, pageSize = 99999) {
-  return dispatch => {
-    dispatch({
-      type: FETCH_COLLECTION_LIST_STARTED
-    });
-
-    const callback = response => {
-      const { items } = response;
-      dispatch({
-        type: FETCH_COLLECTION_LIST_COMPLETED,
-        data: { claims: items }
-      });
-      dispatch(doFetchItemsInCollections({
-        collectionIds: items.map(claim => claim.claim_id),
-        page_size: 5
-      }));
-    };
-
-    const failure = error => {
-      dispatch({
-        type: FETCH_COLLECTION_LIST_FAILED,
-        data: error
-      });
-    };
-
-    lbryProxy.collection_list({ page, page_size: pageSize, resolve_claims: 1, resolve: true }).then(callback, failure);
-  };
-}
-
 function doClaimSearch(options = {
   no_totals: true,
   page_size: 10,
   page: 1
 }) {
   const query = createNormalizedClaimSearchKey(options);
-  return (() => {
-    var _ref2 = _asyncToGenerator$1(function* (dispatch) {
-      dispatch({
-        type: CLAIM_SEARCH_STARTED,
-        data: { query: query }
-      });
-
-      const success = function (data) {
-        const resolveInfo = {};
-        const urls = [];
-        data.items.forEach(function (stream) {
-          resolveInfo[stream.canonical_url] = { stream };
-          urls.push(stream.canonical_url);
-        });
-
-        dispatch({
-          type: CLAIM_SEARCH_COMPLETED,
-          data: {
-            query,
-            resolveInfo,
-            urls,
-            append: options.page && options.page !== 1,
-            pageSize: options.page_size
-          }
-        });
-        return resolveInfo;
-      };
-
-      const failure = function (err) {
-        dispatch({
-          type: CLAIM_SEARCH_FAILED,
-          data: { query },
-          error: err
-        });
-        return false;
-      };
-
-      return yield lbryProxy.claim_search(_extends$5({}, options, {
-        include_purchase_receipt: true
-      })).then(success, failure);
+  return dispatch => {
+    dispatch({
+      type: CLAIM_SEARCH_STARTED,
+      data: { query: query }
     });
 
-    return function (_x2) {
-      return _ref2.apply(this, arguments);
+    const success = data => {
+      const resolveInfo = {};
+      const urls = [];
+      data.items.forEach(stream => {
+        resolveInfo[stream.canonical_url] = { stream };
+        urls.push(stream.canonical_url);
+      });
+
+      dispatch({
+        type: CLAIM_SEARCH_COMPLETED,
+        data: {
+          query,
+          resolveInfo,
+          urls,
+          append: options.page && options.page !== 1,
+          pageSize: options.page_size
+        }
+      });
     };
-  })();
+
+    const failure = err => {
+      dispatch({
+        type: CLAIM_SEARCH_FAILED,
+        data: { query },
+        error: err
+      });
+    };
+
+    lbryProxy.claim_search(_extends$5({}, options, {
+      include_purchase_receipt: true
+    })).then(success, failure);
+  };
 }
 
 function doRepost(options) {
   return dispatch => {
+    // $FlowFixMe
     return new Promise(resolve => {
       dispatch({
         type: CLAIM_REPOST_STARTED
@@ -4410,12 +3632,6 @@ function doRepost(options) {
             repostClaim
           }
         });
-        dispatch({
-          type: UPDATE_PENDING_CLAIMS,
-          data: {
-            claims: [repostClaim]
-          }
-        });
 
         dispatch(doFetchClaimListMine(1, 10));
         resolve(repostClaim);
@@ -4435,151 +3651,6 @@ function doRepost(options) {
   };
 }
 
-function doCollectionPublish(options, localId) {
-  return dispatch => {
-    // $FlowFixMe
-
-    const params = {
-      name: options.name,
-      bid: creditsToString(options.bid),
-      title: options.title,
-      thumbnail_url: options.thumbnail_url,
-      description: options.description,
-      tags: [],
-      languages: options.languages || [],
-      locations: [],
-      blocking: true,
-      claims: options.claims
-    };
-
-    if (options.tags) {
-      params['tags'] = options.tags.map(tag => tag.name);
-    }
-
-    if (options.channel_id) {
-      params['channel_id'] = options.channel_id;
-    }
-
-    return new Promise(resolve => {
-      dispatch({
-        type: COLLECTION_PUBLISH_STARTED
-      });
-
-      function success(response) {
-        const collectionClaim = response.outputs[0];
-        dispatch(batchActions({
-          type: COLLECTION_PUBLISH_COMPLETED,
-          data: { claimId: collectionClaim.claim_id }
-        },
-        // move unpublished collection to pending collection with new publish id
-        // recent publish won't resolve this second. handle it in checkPending
-        {
-          type: UPDATE_PENDING_CLAIMS,
-          data: {
-            claims: [collectionClaim]
-          }
-        }));
-        dispatch({
-          type: COLLECTION_PENDING,
-          data: { localId: localId, claimId: collectionClaim.claim_id }
-        });
-        dispatch(doCheckPendingClaims());
-        dispatch(doFetchCollectionListMine(1, 10));
-        return resolve(collectionClaim);
-      }
-
-      function failure(error) {
-        dispatch({
-          type: COLLECTION_PUBLISH_FAILED,
-          data: {
-            error: error.message
-          }
-        });
-      }
-
-      return lbryProxy.collection_create(params).then(success, failure);
-    });
-  };
-}
-
-function doCollectionPublishUpdate(options, isBackgroundUpdate) {
-  return (dispatch, getState) => {
-    // TODO: implement one click update
-
-    const updateParams = isBackgroundUpdate ? {
-      blocking: true,
-      claim_id: options.claim_id,
-      clear_claims: true
-    } : {
-      bid: creditsToString(options.bid),
-      title: options.title,
-      thumbnail_url: options.thumbnail_url,
-      description: options.description,
-      tags: [],
-      languages: options.languages || [],
-      locations: [],
-      blocking: true,
-      claim_id: options.claim_id,
-      clear_claims: true,
-      replace: true
-    };
-
-    if (isBackgroundUpdate && updateParams.claim_id) {
-      const state = getState();
-      updateParams['claims'] = makeSelectClaimIdsForCollectionId(updateParams.claim_id)(state);
-    } else if (options.claims) {
-      updateParams['claims'] = options.claims;
-    }
-
-    if (options.tags) {
-      updateParams['tags'] = options.tags.map(tag => tag.name);
-    }
-
-    if (options.channel_id) {
-      updateParams['channel_id'] = options.channel_id;
-    }
-
-    return new Promise(resolve => {
-      dispatch({
-        type: COLLECTION_PUBLISH_UPDATE_STARTED
-      });
-
-      function success(response) {
-        const collectionClaim = response.outputs[0];
-        dispatch({
-          type: COLLECTION_PUBLISH_UPDATE_COMPLETED,
-          data: {
-            collectionClaim
-          }
-        });
-        dispatch({
-          type: COLLECTION_PENDING,
-          data: { claimId: collectionClaim.claim_id }
-        });
-        dispatch({
-          type: UPDATE_PENDING_CLAIMS,
-          data: {
-            claims: [collectionClaim]
-          }
-        });
-        dispatch(doCheckPendingClaims());
-        return resolve(collectionClaim);
-      }
-
-      function failure(error) {
-        dispatch({
-          type: COLLECTION_PUBLISH_UPDATE_FAILED,
-          data: {
-            error: error.message
-          }
-        });
-      }
-
-      return lbryProxy.collection_update(updateParams).then(success, failure);
-    });
-  };
-}
-
 function doCheckPublishNameAvailability(name) {
   return dispatch => {
     dispatch({
@@ -4642,530 +3713,51 @@ function doPurchaseList(page = 1, pageSize = PAGE_SIZE) {
   };
 }
 
-const doCheckPendingClaims = onChannelConfirmed => (dispatch, getState) => {
-  if (onChannelConfirmed) {
-    onChannelConfirmCallback = onChannelConfirmed;
-  }
-  clearInterval(checkPendingInterval);
-  const checkTxoList = () => {
+const doCheckPendingClaims = onConfirmed => (dispatch, getState) => {
+  let claimCheckInterval;
+
+  const checkClaimList = () => {
     const state = getState();
-    const pendingById = Object.assign({}, selectPendingClaimsById(state));
-    const pendingTxos = Object.values(pendingById).map(p => p.txid);
-    // use collections
-    const pendingCollections = selectPendingCollections(state);
-    if (pendingTxos.length) {
-      lbryProxy.txo_list({ txid: pendingTxos }).then(result => {
-        const txos = result.items;
-        const idsToConfirm = [];
-        txos.forEach(txo => {
-          if (txo.claim_id && txo.confirmations > 0) {
-            idsToConfirm.push(txo.claim_id);
-            delete pendingById[txo.claim_id];
+    const pendingIdSet = new Set(selectPendingIds(state));
+    lbryProxy.claim_list({ page: 1, page_size: 10 }).then(result => {
+      const claims = result.items;
+      const claimsToConfirm = [];
+      claims.forEach(claim => {
+        const { claim_id: claimId } = claim;
+        if (claim.confirmations > 0 && pendingIdSet.has(claimId)) {
+          pendingIdSet.delete(claimId);
+          claimsToConfirm.push(claim);
+          if (onConfirmed) {
+            onConfirmed(claim);
           }
-        });
-        return { idsToConfirm, pendingById };
-      }).then(results => {
-        const { idsToConfirm, pendingById } = results;
-        if (idsToConfirm.length) {
-          return lbryProxy.claim_list({ claim_id: idsToConfirm, resolve: true }).then(results => {
-            const claims = results.items;
-            const collectionIds = claims.filter(c => c.value_type === 'collection').map(c => c.claim_id);
-            dispatch({
-              type: UPDATE_CONFIRMED_CLAIMS,
-              data: {
-                claims: claims,
-                pending: pendingById
-              }
-            });
-            if (collectionIds.length) {
-              dispatch(doFetchItemsInCollections({
-                collectionIds
-              }));
-            }
-            const channelClaims = claims.filter(claim => claim.value_type === 'channel');
-            if (channelClaims.length && onChannelConfirmCallback) {
-              channelClaims.forEach(claim => onChannelConfirmCallback(claim));
-            }
-            if (Object.keys(pendingById).length === 0) {
-              clearInterval(checkPendingInterval);
-            }
-          });
         }
       });
-    } else {
-      clearInterval(checkPendingInterval);
-    }
+      if (claimsToConfirm.length) {
+        dispatch({
+          type: UPDATE_CONFIRMED_CLAIMS,
+          data: {
+            claims: claimsToConfirm
+          }
+        });
+      }
+      return pendingIdSet.size;
+    }).then(len => {
+      if (!len) {
+        clearInterval(claimCheckInterval);
+      }
+    });
   };
-  // do something with onConfirmed (typically get blocklist for channel)
-  checkPendingInterval = setInterval(() => {
-    checkTxoList();
+
+  claimCheckInterval = setInterval(() => {
+    checkClaimList();
   }, 30000);
 };
 
-function _asyncToGenerator$2(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+const selectState$2 = state => state.fileInfo || {};
 
-const getTimestamp = () => {
-  return Math.floor(Date.now() / 1000);
-};
+const selectFileInfosByOutpoint = reselect.createSelector(selectState$2, state => state.byOutpoint || {});
 
-const FETCH_BATCH_SIZE = 50;
-
-const doLocalCollectionCreate = (name, collectionItems, type, sourceId) => dispatch => {
-  return dispatch({
-    type: COLLECTION_NEW,
-    data: {
-      entry: {
-        id: uuid.v4(), // start with a uuid, this becomes a claimId after publish
-        name: name,
-        updatedAt: getTimestamp(),
-        items: collectionItems || [],
-        sourceId: sourceId,
-        type: type
-      }
-    }
-  });
-};
-
-const doCollectionDelete = (id, colKey = undefined) => (dispatch, getState) => {
-  const state = getState();
-  const claim = makeSelectClaimForClaimId(id)(state);
-  const collectionDelete = () => dispatch({
-    type: COLLECTION_DELETE,
-    data: {
-      id: id,
-      collectionKey: colKey
-    }
-  });
-  if (claim && !colKey) {
-    // could support "abandon, but keep" later
-    const { txid, nout } = claim;
-    return dispatch(doAbandonClaim(txid, nout, collectionDelete));
-  }
-  return collectionDelete();
-};
-
-// Given a collection, save its collectionId to be resolved and displayed in Library
-// export const doCollectionSave = (
-//   id: string,
-// ) => (dispatch: Dispatch) => {
-//   return dispatch({
-//     type: ACTIONS.COLLECTION_SAVE,
-//     data: {
-//       id: id,
-//     },
-//   });
-// };
-
-// Given a collection and name, copy it to a local private collection with a name
-// export const doCollectionCopy = (
-//   id: string,
-// ) => (dispatch: Dispatch) => {
-//   return dispatch({
-//     type: ACTIONS.COLLECTION_COPY,
-//     data: {
-//       id: id,
-//     },
-//   });
-// };
-
-const doFetchItemsInCollections = (resolveItemsOptions, resolveStartedCallback) => (() => {
-  var _ref = _asyncToGenerator$2(function* (dispatch, getState) {
-    let fetchItemsForCollectionClaim = (() => {
-      var _ref2 = _asyncToGenerator$2(function* (claim, pageSize) {
-        const totalItems = claim.value.claims && claim.value.claims.length;
-        const claimId = claim.claim_id;
-        const itemOrder = claim.value.claims;
-
-        const sortResults = function (items, claimList) {
-          const newItems = [];
-          claimList.forEach(function (id) {
-            const index = items.findIndex(function (i) {
-              return i.claim_id === id;
-            });
-            if (index >= 0) {
-              newItems.push(items[index]);
-            }
-          });
-          /*
-            This will return newItems[] of length less than total_items below
-            if one or more of the claims has been abandoned. That's ok for now.
-          */
-          return newItems;
-        };
-
-        const mergeBatches = function (arrayOfResults, claimList) {
-          const mergedResults = {
-            items: [],
-            total_items: 0
-          };
-          arrayOfResults.forEach(function (result) {
-            mergedResults.items = mergedResults.items.concat(result.items);
-            mergedResults.total_items = result.total_items;
-          });
-
-          mergedResults.items = sortResults(mergedResults.items, claimList);
-          return mergedResults;
-        };
-
-        try {
-          const batchSize = pageSize || FETCH_BATCH_SIZE;
-          const batches = [];
-
-          for (let i = 0; i < Math.ceil(totalItems / batchSize); i++) {
-            batches[i] = lbryProxy.claim_search({
-              claim_ids: claim.value.claims,
-              page: i + 1,
-              page_size: batchSize,
-              no_totals: true
-            });
-          }
-          const itemsInBatches = yield Promise.all(batches);
-          const result = mergeBatches(itemsInBatches, itemOrder);
-
-          // $FlowFixMe
-          const itemsById = { claimId: claimId };
-          if (result.items) {
-            itemsById.items = result.items;
-          } else {
-            itemsById.items = null;
-          }
-          return itemsById;
-        } catch (e) {
-          return {
-            claimId: claimId,
-            items: null
-          };
-        }
-      });
-
-      return function fetchItemsForCollectionClaim(_x3, _x4) {
-        return _ref2.apply(this, arguments);
-      };
-    })();
-
-    /*
-    1) make sure all the collection claims are loaded into claims reducer, search/resolve if necessary.
-    2) get the item claims for each
-    3) format and make sure they're in the order as in the claim
-    4) Build the collection objects and update collections reducer
-    5) Update redux claims reducer
-     */
-    let state = getState();
-    const { collectionIds, pageSize } = resolveItemsOptions;
-
-    dispatch({
-      type: COLLECTION_ITEMS_RESOLVE_STARTED,
-      data: { ids: collectionIds }
-    });
-
-    if (resolveStartedCallback) resolveStartedCallback();
-
-    const collectionIdsToSearch = collectionIds.filter(function (claimId) {
-      return !state.claims.byId[claimId];
-    });
-
-    if (collectionIdsToSearch.length) {
-      yield dispatch(doClaimSearch({ claim_ids: collectionIdsToSearch, page: 1, page_size: 9999 }));
-    }
-
-    const stateAfterClaimSearch = getState();
-
-    function formatForClaimActions(resultClaimsByUri) {
-      const formattedClaims = {};
-      Object.entries(resultClaimsByUri).forEach(([uri, uriResolveInfo]) => {
-        // Flow has terrible Object.entries support
-        // https://github.com/facebook/flow/issues/2221
-        if (uriResolveInfo) {
-          let result = {};
-          if (uriResolveInfo.value_type === 'channel') {
-            result.channel = uriResolveInfo;
-            // $FlowFixMe
-            result.claimsInChannel = uriResolveInfo.meta.claims_in_channel;
-            // ALSO SKIP COLLECTIONS
-          } else if (uriResolveInfo.value_type === 'collection') {
-            result.collection = uriResolveInfo;
-          } else {
-            result.stream = uriResolveInfo;
-            if (uriResolveInfo.signing_channel) {
-              result.channel = uriResolveInfo.signing_channel;
-              result.claimsInChannel = uriResolveInfo.signing_channel.meta && uriResolveInfo.signing_channel.meta.claims_in_channel || 0;
-            }
-          }
-          // $FlowFixMe
-          formattedClaims[uri] = result;
-        }
-      });
-      return formattedClaims;
-    }
-
-    const invalidCollectionIds = [];
-    const promisedCollectionItemFetches = [];
-    collectionIds.forEach(function (collectionId) {
-      const claim = makeSelectClaimForClaimId(collectionId)(stateAfterClaimSearch);
-      if (!claim) {
-        invalidCollectionIds.push(collectionId);
-      } else {
-        promisedCollectionItemFetches.push(fetchItemsForCollectionClaim(claim, pageSize));
-      }
-    });
-
-    // $FlowFixMe
-    const collectionItemsById = yield Promise.all(promisedCollectionItemFetches);
-
-    const newCollectionObjectsById = {};
-    const resolvedItemsByUrl = {};
-    collectionItemsById.forEach(function (entry) {
-      // $FlowFixMe
-      const collectionItems = entry.items;
-      const collectionId = entry.claimId;
-      if (collectionItems) {
-        const claim = makeSelectClaimForClaimId(collectionId)(stateAfterClaimSearch);
-
-        const editedCollection = makeSelectEditedCollectionForId(collectionId)(stateAfterClaimSearch);
-        const { name, timestamp, value } = claim || {};
-        const { title } = value;
-        const valueTypes = new Set();
-        const streamTypes = new Set();
-
-        let newItems = [];
-        let isPlaylist;
-
-        if (collectionItems) {
-          collectionItems.forEach(function (collectionItem) {
-            newItems.push(collectionItem.permanent_url);
-            valueTypes.add(collectionItem.value_type);
-            if (collectionItem.value.stream_type) {
-              streamTypes.add(collectionItem.value.stream_type);
-            }
-            resolvedItemsByUrl[collectionItem.canonical_url] = collectionItem;
-          });
-          isPlaylist = valueTypes.size === 1 && valueTypes.has('stream') && (streamTypes.size === 1 && (streamTypes.has('audio') || streamTypes.has('video')) || streamTypes.size === 2 && streamTypes.has('audio') && streamTypes.has('video'));
-        }
-
-        newCollectionObjectsById[collectionId] = {
-          items: newItems,
-          id: collectionId,
-          name: title || name,
-          itemCount: claim.value.claims.length,
-          type: isPlaylist ? 'playlist' : 'collection',
-          updatedAt: timestamp
-        };
-
-        if (editedCollection && timestamp > editedCollection['updatedAt']) {
-          dispatch({
-            type: COLLECTION_DELETE,
-            data: {
-              id: collectionId,
-              collectionKey: 'edited'
-            }
-          });
-        }
-      } else {
-        invalidCollectionIds.push(collectionId);
-      }
-    });
-    const formattedClaimsByUri = formatForClaimActions(collectionItemsById);
-
-    dispatch({
-      type: RESOLVE_URIS_COMPLETED,
-      data: { resolveInfo: formattedClaimsByUri }
-    });
-
-    dispatch({
-      type: COLLECTION_ITEMS_RESOLVE_COMPLETED,
-      data: {
-        resolvedCollections: newCollectionObjectsById,
-        failedCollectionIds: invalidCollectionIds
-      }
-    });
-  });
-
-  return function (_x, _x2) {
-    return _ref.apply(this, arguments);
-  };
-})();
-
-const doFetchItemsInCollection = (options, cb) => {
-  const { collectionId, pageSize } = options;
-  const newOptions = {
-    collectionIds: [collectionId]
-  };
-  if (pageSize) newOptions.pageSize = pageSize;
-  return doFetchItemsInCollections(newOptions, cb);
-};
-
-const doCollectionEdit = (collectionId, params) => (() => {
-  var _ref3 = _asyncToGenerator$2(function* (dispatch, getState) {
-    const state = getState();
-    const collection = makeSelectCollectionForId(collectionId)(state);
-    const editedCollection = makeSelectEditedCollectionForId(collectionId)(state);
-    const unpublishedCollection = makeSelectUnpublishedCollectionForId(collectionId)(state);
-    const publishedCollection = makeSelectPublishedCollectionForId(collectionId)(state); // needs to be published only
-
-    const generateCollectionItemsFromSearchResult = function (results) {
-      return Object.values(results)
-      // $FlowFixMe
-      .reduce(function (acc, cur) {
-        let url;
-        if (cur.stream) {
-          url = cur.stream.permanent_url;
-        } else if (cur.channel) {
-          url = cur.channel.permanent_url;
-        } else if (cur.collection) {
-          url = cur.collection.permanent_url;
-        } else {
-          return acc;
-        }
-        acc.push(url);
-        return acc;
-      }, []);
-    };
-
-    if (!collection) {
-      return dispatch({
-        type: COLLECTION_ERROR,
-        data: {
-          message: 'collection does not exist'
-        }
-      });
-    }
-
-    let currentItems = collection.items ? collection.items.concat() : [];
-    const { claims: passedClaims, order, claimIds, replace, remove, type } = params;
-
-    const collectionType = type || collection.type;
-    let newItems = currentItems;
-
-    if (passedClaims) {
-      if (remove) {
-        const passedUrls = passedClaims.map(function (claim) {
-          return claim.permanent_url;
-        });
-        // $FlowFixMe // need this?
-        newItems = currentItems.filter(function (item) {
-          return !passedUrls.includes(item);
-        });
-      } else {
-        passedClaims.forEach(function (claim) {
-          return newItems.push(claim.permanent_url);
-        });
-      }
-    }
-
-    if (claimIds) {
-      const batches = [];
-      if (claimIds.length > 50) {
-        for (let i = 0; i < Math.ceil(claimIds.length / 50); i++) {
-          batches[i] = claimIds.slice(i * 50, (i + 1) * 50);
-        }
-      } else {
-        batches[0] = claimIds;
-      }
-      const resultArray = yield Promise.all(batches.map(function (batch) {
-        let options = { claim_ids: batch, page: 1, page_size: 50 };
-        return dispatch(doClaimSearch(options));
-      }));
-
-      const searchResults = Object.assign({}, ...resultArray);
-
-      if (replace) {
-        newItems = generateCollectionItemsFromSearchResult(searchResults);
-      } else {
-        newItems = currentItems.concat(generateCollectionItemsFromSearchResult(searchResults));
-      }
-    }
-
-    if (order) {
-      const [movedItem] = currentItems.splice(order.from, 1);
-      currentItems.splice(order.to, 0, movedItem);
-    }
-
-    // console.log('p&e', publishedCollection.items, newItems, publishedCollection.items.join(','), newItems.join(','))
-    if (editedCollection) {
-      // delete edited if newItems are the same as publishedItems
-      if (publishedCollection.items.join(',') === newItems.join(',')) {
-        dispatch({
-          type: COLLECTION_DELETE,
-          data: {
-            id: collectionId,
-            collectionKey: 'edited'
-          }
-        });
-      } else {
-        dispatch({
-          type: COLLECTION_EDIT,
-          data: {
-            id: collectionId,
-            collectionKey: 'edited',
-            collection: {
-              items: newItems,
-              id: collectionId,
-              name: params.name || collection.name,
-              updatedAt: getTimestamp(),
-              type: collectionType
-            }
-          }
-        });
-      }
-    } else if (publishedCollection) {
-      dispatch({
-        type: COLLECTION_EDIT,
-        data: {
-          id: collectionId,
-          collectionKey: 'edited',
-          collection: {
-            items: newItems,
-            id: collectionId,
-            name: params.name || collection.name,
-            updatedAt: getTimestamp(),
-            type: collectionType
-          }
-        }
-      });
-    } else if (BUILTIN_LISTS.includes(collectionId)) {
-      dispatch({
-        type: COLLECTION_EDIT,
-        data: {
-          id: collectionId,
-          collectionKey: 'builtin',
-          collection: {
-            items: newItems,
-            id: collectionId,
-            name: params.name || collection.name,
-            updatedAt: getTimestamp(),
-            type: collectionType
-          }
-        }
-      });
-    } else if (unpublishedCollection) {
-      dispatch({
-        type: COLLECTION_EDIT,
-        data: {
-          id: collectionId,
-          collectionKey: 'unpublished',
-          collection: {
-            items: newItems,
-            id: collectionId,
-            name: params.name || collection.name,
-            updatedAt: getTimestamp(),
-            type: collectionType
-          }
-        }
-      });
-    }
-    return true;
-  });
-
-  return function (_x5, _x6) {
-    return _ref3.apply(this, arguments);
-  };
-})();
-
-const selectState$3 = state => state.fileInfo || {};
-
-const selectFileInfosByOutpoint = reselect.createSelector(selectState$3, state => state.byOutpoint || {});
-
-const selectIsFetchingFileList = reselect.createSelector(selectState$3, state => state.isFetchingFileList);
+const selectIsFetchingFileList = reselect.createSelector(selectState$2, state => state.isFetchingFileList);
 
 const selectIsFetchingFileListDownloadedOrPublished = reselect.createSelector(selectIsFetchingFileList, selectIsFetchingClaimListMine, (isFetchingFileList, isFetchingClaimListMine) => isFetchingFileList || isFetchingClaimListMine);
 
@@ -5175,14 +3767,14 @@ const makeSelectFileInfoForUri = uri => reselect.createSelector(selectClaimsByUr
   return outpoint ? byOutpoint[outpoint] : undefined;
 });
 
-const selectDownloadingByOutpoint = reselect.createSelector(selectState$3, state => state.downloadingByOutpoint || {});
+const selectDownloadingByOutpoint = reselect.createSelector(selectState$2, state => state.downloadingByOutpoint || {});
 
 const makeSelectDownloadingForUri = uri => reselect.createSelector(selectDownloadingByOutpoint, makeSelectFileInfoForUri(uri), (byOutpoint, fileInfo) => {
   if (!fileInfo) return false;
   return byOutpoint[fileInfo.outpoint];
 });
 
-const selectUrisLoading = reselect.createSelector(selectState$3, state => state.fetching || {});
+const selectUrisLoading = reselect.createSelector(selectState$2, state => state.fetching || {});
 
 const makeSelectLoadingForUri = uri => reselect.createSelector(selectUrisLoading, makeSelectClaimForUri(uri), (fetchingByOutpoint, claim) => {
   if (!claim) {
@@ -5236,9 +3828,9 @@ const selectTotalDownloadProgress = reselect.createSelector(selectDownloadingFil
   return -1;
 });
 
-const selectFileListPublishedSort = reselect.createSelector(selectState$3, state => state.fileListPublishedSort);
+const selectFileListPublishedSort = reselect.createSelector(selectState$2, state => state.fileListPublishedSort);
 
-const selectFileListDownloadedSort = reselect.createSelector(selectState$3, state => state.fileListDownloadedSort);
+const selectFileListDownloadedSort = reselect.createSelector(selectState$2, state => state.fileListDownloadedSort);
 
 const selectDownloadedUris = reselect.createSelector(selectFileInfosDownloaded,
 // We should use permament_url but it doesn't exist in file_list
@@ -5391,11 +3983,6 @@ function doPurchaseUri(uri, costInfo, saveFile = true, onSuccess) {
         type: PURCHASE_URI_FAILED,
         data: { uri, error: `Already fetching uri: ${uri}` }
       });
-
-      if (onSuccess) {
-        onSuccess(fileInfo);
-      }
-
       return;
     }
 
@@ -5491,10 +4078,10 @@ var _extends$6 = Object.assign || function (target) { for (var i = 1; i < argume
 
 function _objectWithoutProperties$2(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
 
-const selectState$4 = state => state.publish || {};
+const selectState$3 = state => state.publish || {};
 
 // Is the current uri the same as the uri they clicked "edit" on
-const selectIsStillEditing = reselect.createSelector(selectState$4, publishState => {
+const selectIsStillEditing = reselect.createSelector(selectState$3, publishState => {
   const { editingURI, uri } = publishState;
 
   if (!editingURI || !uri) {
@@ -5519,24 +4106,20 @@ const selectIsStillEditing = reselect.createSelector(selectState$4, publishState
   return currentName === editName;
 });
 
-const selectPublishFormValues = reselect.createSelector(selectState$4, state => state.settings, selectIsStillEditing, (publishState, settingsState, isStillEditing) => {
-  const { languages } = publishState,
-        formValues = _objectWithoutProperties$2(publishState, ['languages']);
-  const language = languages && languages.length && languages[0];
-  const { clientSettings } = settingsState;
-  const { language: languageSet } = clientSettings;
+const selectPublishFormValues = reselect.createSelector(selectState$3, selectIsStillEditing, (state, isStillEditing) => {
+  const { pendingPublish, language, languages } = state,
+        formValues = _objectWithoutProperties$2(state, ['pendingPublish', 'language', 'languages']);
 
   let actualLanguage;
   // Sets default if editing a claim with a set language
-  if (!language && isStillEditing && languageSet) {
-    actualLanguage = languageSet;
+  if (!language && isStillEditing && languages && languages[0]) {
+    actualLanguage = languages[0];
   } else {
-    actualLanguage = language || languageSet || 'en';
+    actualLanguage = language || 'en';
   }
-
   return _extends$6({}, formValues, { language: actualLanguage });
 });
-const makeSelectPublishFormValue = item => reselect.createSelector(selectState$4, state => state[item]);
+const makeSelectPublishFormValue = item => reselect.createSelector(selectState$3, state => state[item]);
 
 const selectMyClaimForUri = reselect.createSelector(selectPublishFormValues, selectIsStillEditing, selectClaimsById, selectMyClaimsWithoutChannels, ({ editingURI, uri }, isStillEditing, claimsById, myClaims) => {
   const { channelName: contentName, streamName: claimName } = parseURI(uri);
@@ -5549,7 +4132,7 @@ const selectMyClaimForUri = reselect.createSelector(selectPublishFormValues, sel
   return isStillEditing ? claimsById[editClaimId] : myClaims.find(claim => !contentName ? claim.name === claimName : claim.name === contentName || claim.name === claimName);
 });
 
-const selectIsResolvingPublishUris = reselect.createSelector(selectState$4, selectResolvingUris, ({ uri, name }, resolvingUris) => {
+const selectIsResolvingPublishUris = reselect.createSelector(selectState$3, selectResolvingUris, ({ uri, name }, resolvingUris) => {
   if (uri) {
     const isResolvingUri = resolvingUris.includes(uri);
     const { isChannel } = parseURI(uri);
@@ -5566,7 +4149,7 @@ const selectIsResolvingPublishUris = reselect.createSelector(selectState$4, sele
   return false;
 });
 
-const selectTakeOverAmount = reselect.createSelector(selectState$4, selectMyClaimForUri, selectClaimsByUri, ({ name }, myClaimForUri, claimsByUri) => {
+const selectTakeOverAmount = reselect.createSelector(selectState$3, selectMyClaimForUri, selectClaimsByUri, ({ name }, myClaimForUri, claimsByUri) => {
   if (!name) {
     return null;
   }
@@ -5591,14 +4174,13 @@ const selectTakeOverAmount = reselect.createSelector(selectState$4, selectMyClai
 
 var _extends$7 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-function _asyncToGenerator$3(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 const doResetThumbnailStatus = () => dispatch => {
   dispatch({
     type: UPDATE_PUBLISH_FORM,
     data: {
-      thumbnailPath: '',
-      thumbnailError: undefined
+      thumbnailPath: ''
     }
   });
 
@@ -5633,7 +4215,7 @@ const doUpdatePublishForm = publishFormValue => dispatch => dispatch({
   data: _extends$7({}, publishFormValue)
 });
 
-const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path, cb) => dispatch => {
+const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path) => dispatch => {
   const downMessage = __('Thumbnail upload service may be down, try again later.');
   let thumbnail, fileExt, fileName, fileType;
 
@@ -5655,29 +4237,18 @@ const doUploadThumbnail = (filePath, thumbnailBlob, fsAdapter, fs, path, cb) =>
     }, doError(error)));
   };
 
-  dispatch({
-    type: UPDATE_PUBLISH_FORM,
-    data: {
-      thumbnailError: undefined
-    }
-  });
-
   const doUpload = data => {
     return fetch(SPEECH_PUBLISH, {
       method: 'POST',
       body: data
     }).then(res => res.text()).then(text => text.length ? JSON.parse(text) : {}).then(json => {
-      if (!json.success) return uploadError(json.message || downMessage);
-      if (cb) {
-        cb(json.data.serveUrl);
-      }
-      return dispatch({
+      return json.success ? dispatch({
         type: UPDATE_PUBLISH_FORM,
         data: {
           uploadThumbnailStatus: COMPLETE,
           thumbnail: json.data.serveUrl
         }
-      });
+      }) : uploadError(json.message || downMessage);
     }).catch(err => {
       let message = err.message;
 
@@ -5745,7 +4316,6 @@ const doPrepareEdit = (claim, uri, fileInfo, fs) => dispatch => {
       currency: 'LBC'
     },
     languages,
-    release_time,
     license,
     license_url: licenseUrl,
     thumbnail,
@@ -5761,8 +4331,6 @@ const doPrepareEdit = (claim, uri, fileInfo, fs) => dispatch => {
     description,
     fee,
     languages,
-    releaseTime: release_time,
-    releaseTimeEdited: undefined,
     thumbnail: thumbnail ? thumbnail.url : null,
     title,
     uri,
@@ -5794,10 +4362,8 @@ const doPrepareEdit = (claim, uri, fileInfo, fs) => dispatch => {
   dispatch({ type: DO_PREPARE_EDIT, data: publishData });
 };
 
-const doPublish = (success, fail, preview) => (dispatch, getState) => {
-  if (!preview) {
-    dispatch({ type: PUBLISH_START });
-  }
+const doPublish = (success, fail) => (dispatch, getState) => {
+  dispatch({ type: PUBLISH_START });
 
   const state = getState();
   const myClaimForUri = selectMyClaimForUri(state);
@@ -5813,7 +4379,6 @@ const doPublish = (success, fail, preview) => (dispatch, getState) => {
     filePath,
     description,
     language,
-    releaseTimeEdited,
     license,
     licenseUrl,
     useLBRYUploader,
@@ -5827,11 +4392,8 @@ const doPublish = (success, fail, preview) => (dispatch, getState) => {
     uri,
     tags,
     locations,
-    optimize,
-    isLivestreamPublish,
-    remoteFileUrl
+    optimize
   } = publishData;
-
   // Handle scenario where we have a claim that has the same name as a channel we are publishing with.
   const myClaimForUriEditing = myClaimForUri && myClaimForUri.name === name ? myClaimForUri : null;
 
@@ -5858,15 +4420,11 @@ const doPublish = (success, fail, preview) => (dispatch, getState) => {
     languages: [language],
     tags: tags && tags.map(tag => tag.name),
     thumbnail_url: thumbnail,
-    blocking: true,
-    preview: false
+    blocking: true
   };
   // Temporary solution to keep the same publish flow with the new tags api
   // Eventually we will allow users to enter their own tags on publish
   // `nsfw` will probably be removed
-  if (remoteFileUrl) {
-    publishPayload.remote_url = remoteFileUrl;
-  }
 
   if (publishingLicense) {
     publishPayload.license = publishingLicense;
@@ -5885,9 +4443,7 @@ const doPublish = (success, fail, preview) => (dispatch, getState) => {
   }
 
   // Set release time to curret date. On edits, keep original release/transaction time as release_time
-  if (releaseTimeEdited) {
-    publishPayload.release_time = releaseTimeEdited;
-  } else if (myClaimForUriEditing && myClaimForUriEditing.value.release_time) {
+  if (myClaimForUriEditing && myClaimForUriEditing.value.release_time) {
     publishPayload.release_time = Number(myClaimForUri.value.release_time);
   } else if (myClaimForUriEditing && myClaimForUriEditing.timestamp) {
     publishPayload.release_time = Number(myClaimForUriEditing.timestamp);
@@ -5914,16 +4470,7 @@ const doPublish = (success, fail, preview) => (dispatch, getState) => {
 
   // Only pass file on new uploads, not metadata only edits.
   // The sdk will figure it out
-  if (filePath && !isLivestreamPublish) publishPayload.file_path = filePath;
-
-  if (preview) {
-    publishPayload.preview = true;
-    publishPayload.optimize_file = false;
-
-    return lbryProxy.publish(publishPayload).then(previewResponse => {
-      return preview(previewResponse);
-    }, fail);
-  }
+  if (filePath) publishPayload.file_path = filePath;
 
   return lbryProxy.publish(publishPayload).then(response => {
     if (!useLBRYUploader) {
@@ -5949,7 +4496,7 @@ const doCheckReflectingFiles = () => (dispatch, getState) => {
   let reflectorCheckInterval;
 
   const checkFileList = (() => {
-    var _ref = _asyncToGenerator$3(function* () {
+    var _ref = _asyncToGenerator(function* () {
       const state = getState();
       const reflectingById = selectReflectingById(state);
       const ids = Object.keys(reflectingById);
@@ -6034,6 +4581,29 @@ function savePosition(claimId, outpoint, position) {
 
 //      
 
+const doToggleTagFollow = name => ({
+  type: TOGGLE_TAG_FOLLOW,
+  data: {
+    name
+  }
+});
+
+const doAddTag = name => ({
+  type: TAG_ADD,
+  data: {
+    name
+  }
+});
+
+const doDeleteTag = name => ({
+  type: TAG_DELETE,
+  data: {
+    name
+  }
+});
+
+//      
+
 function parseQueryParams(queryString) {
   if (queryString === '') return {};
   const parts = queryString.split('?').pop().split('&').map(p => p.split('='));
@@ -6082,7 +4652,6 @@ const defaultState = {
   fetchingChannelClaims: {},
   resolvingUris: [],
   myChannelClaims: undefined,
-  myCollectionClaims: [],
   myClaims: undefined,
   myPurchases: undefined,
   myPurchasesPageNumber: undefined,
@@ -6091,22 +4660,17 @@ const defaultState = {
   fetchingMyPurchases: false,
   fetchingMyPurchasesError: undefined,
   fetchingMyChannels: false,
-  fetchingMyCollections: false,
   abandoningById: {},
-  pendingById: {},
+  pendingIds: [],
   reflectingById: {},
   claimSearchError: false,
   claimSearchByQuery: {},
   claimSearchByQueryLastPageReached: {},
   fetchingClaimSearchByQuery: {},
   updateChannelError: '',
-  updateCollectionError: '',
   updatingChannel: false,
   creatingChannel: false,
   createChannelError: undefined,
-  updatingCollection: false,
-  creatingCollection: false,
-  createCollectionError: undefined,
   pendingChannelImport: false,
   repostLoading: false,
   repostError: undefined,
@@ -6122,22 +4686,23 @@ const defaultState = {
 };
 
 function handleClaimAction(state, action) {
-  const { resolveInfo } = action.data;
+  const {
+    resolveInfo
+  } = action.data;
 
   const byUri = Object.assign({}, state.claimsByUri);
   const byId = Object.assign({}, state.byId);
   const channelClaimCounts = Object.assign({}, state.channelClaimCounts);
-  const pendingById = state.pendingById;
+  const pendingIds = state.pendingIds;
   let newResolvingUrls = new Set(state.resolvingUris);
   let myClaimIds = new Set(state.myClaims);
 
   Object.entries(resolveInfo).forEach(([url, resolveResponse]) => {
     // $FlowFixMe
-    const { claimsInChannel, stream, channel: channelFromResolve, collection } = resolveResponse;
-    const channel = channelFromResolve || stream && stream.signing_channel;
+    const { claimsInChannel, stream, channel } = resolveResponse;
 
     if (stream) {
-      if (pendingById[stream.claim_id]) {
+      if (pendingIds.includes(stream.claim_id)) {
         byId[stream.claim_id] = mergeClaims(stream, byId[stream.claim_id]);
       } else {
         byId[stream.claim_id] = stream;
@@ -6167,37 +4732,20 @@ function handleClaimAction(state, action) {
         channelClaimCounts[channel.canonical_url] = claimsInChannel;
       }
 
-      if (pendingById[channel.claim_id]) {
+      if (pendingIds.includes(channel.claim_id)) {
         byId[channel.claim_id] = mergeClaims(channel, byId[channel.claim_id]);
       } else {
         byId[channel.claim_id] = channel;
       }
-
+      // Also add the permanent_url here until lighthouse returns canonical_url for search results
       byUri[channel.permanent_url] = channel.claim_id;
       byUri[channel.canonical_url] = channel.claim_id;
       newResolvingUrls.delete(channel.canonical_url);
       newResolvingUrls.delete(channel.permanent_url);
     }
 
-    if (collection) {
-      if (pendingById[collection.claim_id]) {
-        byId[collection.claim_id] = mergeClaims(collection, byId[collection.claim_id]);
-      } else {
-        byId[collection.claim_id] = collection;
-      }
-      byUri[url] = collection.claim_id;
-      byUri[collection.canonical_url] = collection.claim_id;
-      byUri[collection.permanent_url] = collection.claim_id;
-      newResolvingUrls.delete(collection.canonical_url);
-      newResolvingUrls.delete(collection.permanent_url);
-
-      if (collection.is_my_output) {
-        myClaimIds.add(collection.claim_id);
-      }
-    }
-
     newResolvingUrls.delete(url);
-    if (!stream && !channel && !collection && !pendingById[byUri[url]]) {
+    if (!stream && !channel && !pendingIds.includes(byUri[url])) {
       byUri[url] = null;
     }
   });
@@ -6237,33 +4785,34 @@ reducers[FETCH_CLAIM_LIST_MINE_STARTED] = state => Object.assign({}, state, {
 });
 
 reducers[FETCH_CLAIM_LIST_MINE_COMPLETED] = (state, action) => {
-  const { result } = action.data;
+  const { result, resolve } = action.data;
   const claims = result.items;
   const page = result.page;
   const totalItems = result.total_items;
 
   const byId = Object.assign({}, state.byId);
   const byUri = Object.assign({}, state.claimsByUri);
-  const pendingById = Object.assign({}, state.pendingById);
+  const pendingIds = state.pendingIds || [];
   let myClaimIds = new Set(state.myClaims);
   let urlsForCurrentPage = [];
 
+  const pendingIdSet = new Set(pendingIds);
+
   claims.forEach(claim => {
-    const { permanent_url: permanentUri, claim_id: claimId, canonical_url: canonicalUri } = claim;
+    const { permanent_url: permanentUri, claim_id: claimId } = claim;
     if (claim.type && claim.type.match(/claim|update/)) {
       urlsForCurrentPage.push(permanentUri);
       if (claim.confirmations < 1) {
-        pendingById[claimId] = claim;
-        if (byId[claimId]) {
-          byId[claimId] = mergeClaims(claim, byId[claimId]);
-        } else {
-          byId[claimId] = claim;
-        }
+        pendingIdSet.add(claimId);
+      } else if (!resolve && pendingIdSet.has(claimId) && claim.confirmations > 0) {
+        pendingIdSet.delete(claimId);
+      }
+      if (pendingIds.includes(claimId)) {
+        byId[claimId] = mergeClaims(claim, byId[claimId]);
       } else {
         byId[claimId] = claim;
       }
       byUri[permanentUri] = claimId;
-      byUri[canonicalUri] = claimId;
       myClaimIds.add(claimId);
     }
   });
@@ -6272,7 +4821,7 @@ reducers[FETCH_CLAIM_LIST_MINE_COMPLETED] = (state, action) => {
     isFetchingClaimListMine: false,
     myClaims: Array.from(myClaimIds),
     byId,
-    pendingById,
+    pendingIds: Array.from(pendingIdSet),
     claimsByUri: byUri,
     myClaimsPageResults: urlsForCurrentPage,
     myClaimsPageNumber: page,
@@ -6284,8 +4833,9 @@ reducers[FETCH_CHANNEL_LIST_STARTED] = state => Object.assign({}, state, { fetch
 
 reducers[FETCH_CHANNEL_LIST_COMPLETED] = (state, action) => {
   const { claims } = action.data;
+  const myClaims = state.myClaims || [];
   let myClaimIds = new Set(state.myClaims);
-  const pendingById = Object.assign({}, state.pendingById);
+  const pendingIds = state.pendingIds || [];
   let myChannelClaims;
   const byId = Object.assign({}, state.byId);
   const byUri = Object.assign({}, state.claimsByUri);
@@ -6298,12 +4848,7 @@ reducers[FETCH_CHANNEL_LIST_COMPLETED] = (state, action) => {
     myChannelClaims = new Set(state.myChannelClaims);
     claims.forEach(claim => {
       const { claims_in_channel: claimsInChannel } = claim.meta;
-      const {
-        canonical_url: canonicalUrl,
-        permanent_url: permanentUrl,
-        claim_id: claimId,
-        confirmations
-      } = claim;
+      const { canonical_url: canonicalUrl, permanent_url: permanentUrl, claim_id: claimId } = claim;
 
       byUri[canonicalUrl] = claimId;
       byUri[permanentUrl] = claimId;
@@ -6312,14 +4857,7 @@ reducers[FETCH_CHANNEL_LIST_COMPLETED] = (state, action) => {
 
       // $FlowFixMe
       myChannelClaims.add(claimId);
-      if (confirmations < 1) {
-        pendingById[claimId] = claim;
-        if (byId[claimId]) {
-          byId[claimId] = mergeClaims(claim, byId[claimId]);
-        } else {
-          byId[claimId] = claim;
-        }
-      } else {
+      if (!pendingIds.some(c => c === claimId)) {
         byId[claimId] = claim;
       }
       myClaimIds.add(claimId);
@@ -6328,7 +4866,6 @@ reducers[FETCH_CHANNEL_LIST_COMPLETED] = (state, action) => {
 
   return Object.assign({}, state, {
     byId,
-    pendingById,
     claimsByUri: byUri,
     channelClaimCounts,
     fetchingMyChannels: false,
@@ -6343,63 +4880,6 @@ reducers[FETCH_CHANNEL_LIST_FAILED] = (state, action) => {
   });
 };
 
-reducers[FETCH_COLLECTION_LIST_STARTED] = state => _extends$9({}, state, {
-  fetchingMyCollections: true
-});
-
-reducers[FETCH_COLLECTION_LIST_COMPLETED] = (state, action) => {
-  const { claims } = action.data;
-  const myClaims = state.myClaims || [];
-  let myClaimIds = new Set(myClaims);
-  const pendingById = Object.assign({}, state.pendingById);
-  let myCollectionClaimsSet = new Set([]);
-  const byId = Object.assign({}, state.byId);
-  const byUri = Object.assign({}, state.claimsByUri);
-
-  if (claims.length) {
-    myCollectionClaimsSet = new Set(state.myCollectionClaims);
-    claims.forEach(claim => {
-      const {
-        canonical_url: canonicalUrl,
-        permanent_url: permanentUrl,
-        claim_id: claimId,
-        confirmations
-      } = claim;
-
-      byUri[canonicalUrl] = claimId;
-      byUri[permanentUrl] = claimId;
-
-      // $FlowFixMe
-      myCollectionClaimsSet.add(claimId);
-      // we don't want to overwrite a pending result with a resolve
-      if (confirmations < 1) {
-        pendingById[claimId] = claim;
-        if (byId[claimId]) {
-          byId[claimId] = mergeClaims(claim, byId[claimId]);
-        } else {
-          byId[claimId] = claim;
-        }
-      } else {
-        byId[claimId] = claim;
-      }
-      myClaimIds.add(claimId);
-    });
-  }
-
-  return _extends$9({}, state, {
-    byId,
-    pendingById,
-    claimsByUri: byUri,
-    fetchingMyCollections: false,
-    myCollectionClaims: Array.from(myCollectionClaimsSet),
-    myClaims: myClaimIds ? Array.from(myClaimIds) : null
-  });
-};
-
-reducers[FETCH_COLLECTION_LIST_FAILED] = state => {
-  return _extends$9({}, state, { fetchingMyCollections: false });
-};
-
 reducers[FETCH_CHANNEL_CLAIMS_STARTED] = (state, action) => {
   const { uri, page } = action.data;
   const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims);
@@ -6474,8 +4954,9 @@ reducers[ABANDON_CLAIM_STARTED] = (state, action) => {
 reducers[UPDATE_PENDING_CLAIMS] = (state, action) => {
   const { claims: pendingClaims } = action.data;
   const byId = Object.assign({}, state.byId);
-  const pendingById = Object.assign({}, state.pendingById);
   const byUri = Object.assign({}, state.claimsByUri);
+  const pendingIds = state.pendingIds;
+  const pendingIdSet = new Set(pendingIds);
   let myClaimIds = new Set(state.myClaims);
   const myChannelClaims = new Set(state.myChannelClaims);
 
@@ -6483,7 +4964,7 @@ reducers[UPDATE_PENDING_CLAIMS] = (state, action) => {
   pendingClaims.forEach(claim => {
     let newClaim;
     const { permanent_url: uri, claim_id: claimId, type, value_type: valueType } = claim;
-    pendingById[claimId] = claim; // make sure we don't need to merge?
+    pendingIdSet.add(claimId);
     const oldClaim = byId[claimId];
     if (oldClaim && oldClaim.canonical_url) {
       newClaim = mergeClaims(oldClaim, claim);
@@ -6503,22 +4984,21 @@ reducers[UPDATE_PENDING_CLAIMS] = (state, action) => {
   return Object.assign({}, state, {
     myClaims: Array.from(myClaimIds),
     byId,
-    pendingById,
     myChannelClaims: Array.from(myChannelClaims),
-    claimsByUri: byUri
+    claimsByUri: byUri,
+    pendingIds: Array.from(pendingIdSet)
   });
 };
 
 reducers[UPDATE_CONFIRMED_CLAIMS] = (state, action) => {
-  const {
-    claims: confirmedClaims,
-    pending: pendingClaims
-  } = action.data;
+  const { claims: confirmedClaims } = action.data;
   const byId = Object.assign({}, state.byId);
   const byUri = Object.assign({}, state.claimsByUri);
-  //
+  const pendingIds = state.pendingIds;
+  const pendingIdSet = new Set(pendingIds);
+
   confirmedClaims.forEach(claim => {
-    const { claim_id: claimId, type } = claim;
+    const { permanent_url: permanentUri, claim_id: claimId, type } = claim;
     let newClaim = claim;
     const oldClaim = byId[claimId];
     if (oldClaim && oldClaim.canonical_url) {
@@ -6526,10 +5006,11 @@ reducers[UPDATE_CONFIRMED_CLAIMS] = (state, action) => {
     }
     if (type && type.match(/claim|update|channel/)) {
       byId[claimId] = newClaim;
+      pendingIdSet.delete(claimId);
     }
   });
   return Object.assign({}, state, {
-    pendingById: pendingClaims,
+    pendingIds: Array.from(pendingIdSet),
     byId,
     claimsByUri: byUri
   });
@@ -6541,7 +5022,6 @@ reducers[ABANDON_CLAIM_SUCCEEDED] = (state, action) => {
   const newMyClaims = state.myClaims ? state.myClaims.slice() : [];
   const newMyChannelClaims = state.myChannelClaims ? state.myChannelClaims.slice() : [];
   const claimsByUri = Object.assign({}, state.claimsByUri);
-  const newMyCollectionClaims = state.myCollectionClaims ? state.myCollectionClaims.slice() : [];
 
   Object.keys(claimsByUri).forEach(uri => {
     if (claimsByUri[uri] === claimId) {
@@ -6550,14 +5030,12 @@ reducers[ABANDON_CLAIM_SUCCEEDED] = (state, action) => {
   });
   const myClaims = newMyClaims.filter(i => i !== claimId);
   const myChannelClaims = newMyChannelClaims.filter(i => i !== claimId);
-  const myCollectionClaims = newMyCollectionClaims.filter(i => i !== claimId);
 
   delete byId[claimId];
 
   return Object.assign({}, state, {
     myClaims,
     myChannelClaims,
-    myCollectionClaims,
     byId,
     claimsByUri
   });
@@ -6607,59 +5085,6 @@ reducers[UPDATE_CHANNEL_FAILED] = (state, action) => {
   });
 };
 
-reducers[CLEAR_COLLECTION_ERRORS] = state => _extends$9({}, state, {
-  createCollectionError: null,
-  updateCollectionError: null
-});
-
-reducers[COLLECTION_PUBLISH_STARTED] = state => _extends$9({}, state, {
-  creatingCollection: true,
-  createCollectionError: null
-});
-
-reducers[COLLECTION_PUBLISH_COMPLETED] = (state, action) => {
-  const myCollections = state.myCollectionClaims || [];
-  const myClaims = state.myClaims || [];
-  const { claimId } = action.data;
-  let myClaimIds = new Set(myClaims);
-  let myCollectionClaimsSet = new Set(myCollections);
-  myClaimIds.add(claimId);
-  myCollectionClaimsSet.add(claimId);
-  return Object.assign({}, state, {
-    creatingCollection: false,
-    myClaims: Array.from(myClaimIds),
-    myCollectionClaims: Array.from(myCollectionClaimsSet)
-  });
-};
-
-reducers[COLLECTION_PUBLISH_FAILED] = (state, action) => {
-  return Object.assign({}, state, {
-    creatingCollection: false,
-    createCollectionError: action.data.error
-  });
-};
-
-reducers[COLLECTION_PUBLISH_UPDATE_STARTED] = (state, action) => {
-  return Object.assign({}, state, {
-    updateCollectionError: '',
-    updatingCollection: true
-  });
-};
-
-reducers[COLLECTION_PUBLISH_UPDATE_COMPLETED] = (state, action) => {
-  return Object.assign({}, state, {
-    updateCollectionError: '',
-    updatingCollection: false
-  });
-};
-
-reducers[COLLECTION_PUBLISH_UPDATE_FAILED] = (state, action) => {
-  return Object.assign({}, state, {
-    updateCollectionError: action.data.error,
-    updatingCollection: false
-  });
-};
-
 reducers[IMPORT_CHANNEL_STARTED] = state => Object.assign({}, state, { pendingChannelImports: true });
 
 reducers[IMPORT_CHANNEL_COMPLETED] = state => Object.assign({}, state, { pendingChannelImports: false });
@@ -6702,20 +5127,13 @@ reducers[CLAIM_SEARCH_FAILED] = (state, action) => {
   const { query } = action.data;
   const claimSearchByQuery = Object.assign({}, state.claimSearchByQuery);
   const fetchingClaimSearchByQuery = Object.assign({}, state.fetchingClaimSearchByQuery);
-  const claimSearchByQueryLastPageReached = Object.assign({}, state.claimSearchByQueryLastPageReached);
 
   delete fetchingClaimSearchByQuery[query];
-
-  if (claimSearchByQuery[query] && claimSearchByQuery[query].length !== 0) {
-    claimSearchByQueryLastPageReached[query] = true;
-  } else {
-    claimSearchByQuery[query] = null;
-  }
+  claimSearchByQuery[query] = null;
 
   return Object.assign({}, state, {
     fetchingClaimSearchByQuery,
-    claimSearchByQuery,
-    claimSearchByQueryLastPageReached
+    claimSearchByQuery
   });
 };
 
@@ -7166,7 +5584,6 @@ const defaultState$4 = {
   fileDur: 0,
   fileSize: 0,
   fileVid: false,
-  remoteFileUrl: undefined,
   contentIsFree: true,
   fee: {
     amount: 1,
@@ -7176,17 +5593,14 @@ const defaultState$4 = {
   thumbnail_url: '',
   thumbnailPath: '',
   uploadThumbnailStatus: API_DOWN,
-  thumbnailError: undefined,
   description: '',
   language: '',
-  releaseTime: undefined,
-  releaseTimeEdited: undefined,
   nsfw: false,
   channel: CHANNEL_ANONYMOUS,
   channelId: '',
   name: '',
   nameError: undefined,
-  bid: 0.01,
+  bid: 0.1,
   bidError: undefined,
   licenseType: 'None',
   otherLicenseDescription: 'All rights reserved',
@@ -7205,11 +5619,9 @@ const publishReducer = handleActions({
     return _extends$c({}, state, data);
   },
   [CLEAR_PUBLISH]: state => _extends$c({}, defaultState$4, {
-    uri: undefined,
     channel: state.channel,
     bid: state.bid,
-    optimize: state.optimize,
-    language: state.language
+    optimize: state.optimize
   }),
   [PUBLISH_START]: state => _extends$c({}, state, {
     publishing: true,
@@ -7242,6 +5654,73 @@ const publishReducer = handleActions({
 
 var _extends$d = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
+function getDefaultKnownTags() {
+  return DEFAULT_FOLLOWED_TAGS.concat(DEFAULT_KNOWN_TAGS).reduce((tagsMap, tag) => _extends$d({}, tagsMap, {
+    [tag]: { name: tag }
+  }), {});
+}
+
+const defaultState$5 = {
+  followedTags: [],
+  knownTags: getDefaultKnownTags()
+};
+
+const tagsReducer = handleActions({
+  [TOGGLE_TAG_FOLLOW]: (state, action) => {
+    const { followedTags } = state;
+    const { name } = action.data;
+
+    let newFollowedTags = followedTags.slice();
+
+    if (newFollowedTags.includes(name)) {
+      newFollowedTags = newFollowedTags.filter(tag => tag !== name);
+    } else {
+      newFollowedTags.push(name);
+    }
+
+    return _extends$d({}, state, {
+      followedTags: newFollowedTags
+    });
+  },
+
+  [TAG_ADD]: (state, action) => {
+    const { knownTags } = state;
+    const { name } = action.data;
+
+    let newKnownTags = _extends$d({}, knownTags);
+    newKnownTags[name] = { name };
+
+    return _extends$d({}, state, {
+      knownTags: newKnownTags
+    });
+  },
+
+  [TAG_DELETE]: (state, action) => {
+    const { knownTags, followedTags } = state;
+    const { name } = action.data;
+
+    let newKnownTags = _extends$d({}, knownTags);
+    delete newKnownTags[name];
+    const newFollowedTags = followedTags.filter(tag => tag !== name);
+
+    return _extends$d({}, state, {
+      knownTags: newKnownTags,
+      followedTags: newFollowedTags
+    });
+  },
+  [USER_STATE_POPULATE]: (state, action) => {
+    const { tags } = action.data;
+    if (Array.isArray(tags)) {
+      return _extends$d({}, state, {
+        followedTags: tags
+      });
+    }
+    return _extends$d({}, state);
+  }
+}, defaultState$5);
+
+var _extends$e = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
 const buildDraftTransaction = () => ({
   amount: undefined,
   address: undefined
@@ -7251,7 +5730,7 @@ const buildDraftTransaction = () => ({
 // See details in https://github.com/lbryio/lbry/issues/1307
 
 
-const defaultState$5 = {
+const defaultState$6 = {
   balance: undefined,
   totalBalance: undefined,
   reservedBalance: undefined,
@@ -7284,159 +5763,61 @@ const defaultState$5 = {
   transactionListFilter: 'all',
   walletReconnecting: false,
   txoFetchParams: {},
-  utxoCounts: {},
-  fetchingUtxoCounts: false,
-  fetchingUtxoError: undefined,
-  consolidatingUtxos: false,
-  pendingConsolidateTxid: null,
-  massClaimingTips: false,
-  pendingMassClaimTxid: null,
   txoPage: {},
-  fetchId: '',
   fetchingTxos: false,
   fetchingTxosError: undefined,
   pendingSupportTransactions: {},
-  pendingTxos: [],
-
   abandonClaimSupportError: undefined
 };
 
 const walletReducer = handleActions({
-  [FETCH_TRANSACTIONS_STARTED]: state => _extends$d({}, state, {
+  [FETCH_TRANSACTIONS_STARTED]: state => _extends$e({}, state, {
     fetchingTransactions: true
   }),
 
   [FETCH_TRANSACTIONS_COMPLETED]: (state, action) => {
-    const byId = _extends$d({}, state.transactions);
+    const byId = _extends$e({}, state.transactions);
 
     const { transactions } = action.data;
     transactions.forEach(transaction => {
       byId[transaction.txid] = transaction;
     });
 
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       transactions: byId,
       fetchingTransactions: false
     });
   },
 
-  [FETCH_TXO_PAGE_STARTED]: (state, action) => {
-    return _extends$d({}, state, {
-      fetchId: action.data,
+  [FETCH_TXO_PAGE_STARTED]: state => {
+    return _extends$e({}, state, {
       fetchingTxos: true,
       fetchingTxosError: undefined
     });
   },
 
   [FETCH_TXO_PAGE_COMPLETED]: (state, action) => {
-    if (state.fetchId !== action.data.fetchId) {
-      // Leave 'state' and 'fetchingTxos' alone. The latter would ensure
-      // the spiner would continue spinning for the latest transaction.
-      return _extends$d({}, state);
-    }
-
-    return _extends$d({}, state, {
-      txoPage: action.data.result,
-      fetchId: '',
+    return _extends$e({}, state, {
+      txoPage: action.data,
       fetchingTxos: false
     });
   },
 
   [FETCH_TXO_PAGE_FAILED]: (state, action) => {
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       txoPage: {},
-      fetchId: '',
       fetchingTxos: false,
       fetchingTxosError: action.data
     });
   },
-  [FETCH_UTXO_COUNT_STARTED]: state => {
-    return _extends$d({}, state, {
-      fetchingUtxoCounts: true,
-      fetchingUtxoError: undefined
-    });
-  },
-
-  [FETCH_UTXO_COUNT_COMPLETED]: (state, action) => {
-    return _extends$d({}, state, {
-      utxoCounts: action.data,
-      fetchingUtxoCounts: false
-    });
-  },
-  [FETCH_UTXO_COUNT_FAILED]: (state, action) => {
-    return _extends$d({}, state, {
-      utxoCounts: {},
-      fetchingUtxoCounts: false,
-      fetchingUtxoError: action.data
-    });
-  },
-  [DO_UTXO_CONSOLIDATE_STARTED]: state => {
-    return _extends$d({}, state, {
-      consolidatingUtxos: true
-    });
-  },
-
-  [DO_UTXO_CONSOLIDATE_COMPLETED]: (state, action) => {
-    const { txid } = action.data;
-    return _extends$d({}, state, {
-      consolidatingUtxos: false,
-      pendingConsolidateTxid: txid
-    });
-  },
-
-  [DO_UTXO_CONSOLIDATE_FAILED]: (state, action) => {
-    return _extends$d({}, state, {
-      consolidatingUtxos: false
-    });
-  },
-
-  [TIP_CLAIM_MASS_STARTED]: state => {
-    return _extends$d({}, state, {
-      massClaimingTips: true
-    });
-  },
-
-  [TIP_CLAIM_MASS_COMPLETED]: (state, action) => {
-    const { txid } = action.data;
-    return _extends$d({}, state, {
-      massClaimingTips: false,
-      pendingMassClaimTxid: txid
-    });
-  },
-
-  [TIP_CLAIM_MASS_FAILED]: (state, action) => {
-    return _extends$d({}, state, {
-      massClaimingTips: false
-    });
-  },
-
-  [PENDING_CONSOLIDATED_TXOS_UPDATED]: (state, action) => {
-    const { pendingTxos, pendingMassClaimTxid, pendingConsolidateTxid } = state;
-
-    const { txids, remove } = action.data;
-
-    if (remove) {
-      const newTxos = pendingTxos.filter(txo => !txids.includes(txo));
-      const newPendingMassClaimTxid = txids.includes(pendingMassClaimTxid) ? undefined : pendingMassClaimTxid;
-      const newPendingConsolidateTxid = txids.includes(pendingConsolidateTxid) ? undefined : pendingConsolidateTxid;
-      return _extends$d({}, state, {
-        pendingTxos: newTxos,
-        pendingMassClaimTxid: newPendingMassClaimTxid,
-        pendingConsolidateTxid: newPendingConsolidateTxid
-      });
-    } else {
-      const newPendingSet = new Set([...pendingTxos, ...txids]);
-      return _extends$d({}, state, { pendingTxos: Array.from(newPendingSet) });
-    }
-  },
 
   [UPDATE_TXO_FETCH_PARAMS]: (state, action) => {
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       txoFetchParams: action.data
     });
   },
 
-  [FETCH_SUPPORTS_STARTED]: state => _extends$d({}, state, {
+  [FETCH_SUPPORTS_STARTED]: state => _extends$e({}, state, {
     fetchingSupports: true
   }),
 
@@ -7449,7 +5830,7 @@ const walletReducer = handleActions({
       byOutpoint[`${txid}:${nout}`] = transaction;
     });
 
-    return _extends$d({}, state, { supports: byOutpoint, fetchingSupports: false });
+    return _extends$e({}, state, { supports: byOutpoint, fetchingSupports: false });
   },
 
   [ABANDON_SUPPORT_STARTED]: (state, action) => {
@@ -7458,7 +5839,7 @@ const walletReducer = handleActions({
 
     currentlyAbandoning[outpoint] = true;
 
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       abandoningSupportsByOutpoint: currentlyAbandoning
     });
   },
@@ -7471,64 +5852,60 @@ const walletReducer = handleActions({
     delete currentlyAbandoning[outpoint];
     delete byOutpoint[outpoint];
 
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       supports: byOutpoint,
-      abandoningSupportsByOutpoint: currentlyAbandoning
+      abandoningSupportsById: currentlyAbandoning
     });
   },
 
   [ABANDON_CLAIM_SUPPORT_STARTED]: (state, action) => {
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       abandonClaimSupportError: undefined
     });
   },
 
   [ABANDON_CLAIM_SUPPORT_PREVIEW]: (state, action) => {
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       abandonClaimSupportError: undefined
     });
   },
 
   [ABANDON_CLAIM_SUPPORT_COMPLETED]: (state, action) => {
-    const {
-      claimId,
-      type,
-      txid,
-      effective
-    } = action.data;
+    const { claimId, type, txid, effective } = action.data;
     const pendingtxs = Object.assign({}, state.pendingSupportTransactions);
 
     pendingtxs[claimId] = { txid, type, effective };
 
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       pendingSupportTransactions: pendingtxs,
       abandonClaimSupportError: undefined
     });
   },
 
   [ABANDON_CLAIM_SUPPORT_FAILED]: (state, action) => {
-    return _extends$d({}, state, {
+    return _extends$e({}, state, {
       abandonClaimSupportError: action.data
     });
   },
 
   [PENDING_SUPPORTS_UPDATED]: (state, action) => {
-    return _extends$d({}, state, {
+
+    return _extends$e({}, state, {
       pendingSupportTransactions: action.data
     });
   },
 
-  [GET_NEW_ADDRESS_STARTED]: state => _extends$d({}, state, {
+  [GET_NEW_ADDRESS_STARTED]: state => _extends$e({}, state, {
     gettingNewAddress: true
   }),
 
   [GET_NEW_ADDRESS_COMPLETED]: (state, action) => {
     const { address } = action.data;
 
-    return _extends$d({}, state, { gettingNewAddress: false, receiveAddress: address });
+    return _extends$e({}, state, { gettingNewAddress: false, receiveAddress: address });
   },
 
-  [UPDATE_BALANCE]: (state, action) => _extends$d({}, state, {
+  [UPDATE_BALANCE]: (state, action) => _extends$e({}, state, {
     totalBalance: action.data.totalBalance,
     balance: action.data.balance,
     reservedBalance: action.data.reservedBalance,
@@ -7537,32 +5914,32 @@ const walletReducer = handleActions({
     tipsBalance: action.data.tipsBalance
   }),
 
-  [CHECK_ADDRESS_IS_MINE_STARTED]: state => _extends$d({}, state, {
+  [CHECK_ADDRESS_IS_MINE_STARTED]: state => _extends$e({}, state, {
     checkingAddressOwnership: true
   }),
 
-  [CHECK_ADDRESS_IS_MINE_COMPLETED]: state => _extends$d({}, state, {
+  [CHECK_ADDRESS_IS_MINE_COMPLETED]: state => _extends$e({}, state, {
     checkingAddressOwnership: false
   }),
 
   [SET_DRAFT_TRANSACTION_AMOUNT]: (state, action) => {
     const oldDraft = state.draftTransaction;
-    const newDraft = _extends$d({}, oldDraft, { amount: parseFloat(action.data.amount) });
+    const newDraft = _extends$e({}, oldDraft, { amount: parseFloat(action.data.amount) });
 
-    return _extends$d({}, state, { draftTransaction: newDraft });
+    return _extends$e({}, state, { draftTransaction: newDraft });
   },
 
   [SET_DRAFT_TRANSACTION_ADDRESS]: (state, action) => {
     const oldDraft = state.draftTransaction;
-    const newDraft = _extends$d({}, oldDraft, { address: action.data.address });
+    const newDraft = _extends$e({}, oldDraft, { address: action.data.address });
 
-    return _extends$d({}, state, { draftTransaction: newDraft });
+    return _extends$e({}, state, { draftTransaction: newDraft });
   },
 
   [SEND_TRANSACTION_STARTED]: state => {
-    const newDraftTransaction = _extends$d({}, state.draftTransaction, { sending: true });
+    const newDraftTransaction = _extends$e({}, state.draftTransaction, { sending: true });
 
-    return _extends$d({}, state, { draftTransaction: newDraftTransaction });
+    return _extends$e({}, state, { draftTransaction: newDraftTransaction });
   },
 
   [SEND_TRANSACTION_COMPLETED]: state => Object.assign({}, state, {
@@ -7575,341 +5952,123 @@ const walletReducer = handleActions({
       error: action.data.error
     });
 
-    return _extends$d({}, state, { draftTransaction: newDraftTransaction });
+    return _extends$e({}, state, { draftTransaction: newDraftTransaction });
   },
 
-  [SUPPORT_TRANSACTION_STARTED]: state => _extends$d({}, state, {
+  [SUPPORT_TRANSACTION_STARTED]: state => _extends$e({}, state, {
     sendingSupport: true
   }),
 
-  [SUPPORT_TRANSACTION_COMPLETED]: state => _extends$d({}, state, {
+  [SUPPORT_TRANSACTION_COMPLETED]: state => _extends$e({}, state, {
     sendingSupport: false
   }),
 
-  [SUPPORT_TRANSACTION_FAILED]: (state, action) => _extends$d({}, state, {
+  [SUPPORT_TRANSACTION_FAILED]: (state, action) => _extends$e({}, state, {
     error: action.data.error,
     sendingSupport: false
   }),
 
-  [CLEAR_SUPPORT_TRANSACTION]: state => _extends$d({}, state, {
+  [CLEAR_SUPPORT_TRANSACTION]: state => _extends$e({}, state, {
     sendingSupport: false
   }),
 
-  [WALLET_STATUS_COMPLETED]: (state, action) => _extends$d({}, state, {
+  [WALLET_STATUS_COMPLETED]: (state, action) => _extends$e({}, state, {
     walletIsEncrypted: action.result
   }),
 
-  [WALLET_ENCRYPT_START]: state => _extends$d({}, state, {
+  [WALLET_ENCRYPT_START]: state => _extends$e({}, state, {
     walletEncryptPending: true,
     walletEncryptSucceded: null,
     walletEncryptResult: null
   }),
 
-  [WALLET_ENCRYPT_COMPLETED]: (state, action) => _extends$d({}, state, {
+  [WALLET_ENCRYPT_COMPLETED]: (state, action) => _extends$e({}, state, {
     walletEncryptPending: false,
     walletEncryptSucceded: true,
     walletEncryptResult: action.result
   }),
 
-  [WALLET_ENCRYPT_FAILED]: (state, action) => _extends$d({}, state, {
+  [WALLET_ENCRYPT_FAILED]: (state, action) => _extends$e({}, state, {
     walletEncryptPending: false,
     walletEncryptSucceded: false,
     walletEncryptResult: action.result
   }),
 
-  [WALLET_DECRYPT_START]: state => _extends$d({}, state, {
+  [WALLET_DECRYPT_START]: state => _extends$e({}, state, {
     walletDecryptPending: true,
     walletDecryptSucceded: null,
     walletDecryptResult: null
   }),
 
-  [WALLET_DECRYPT_COMPLETED]: (state, action) => _extends$d({}, state, {
+  [WALLET_DECRYPT_COMPLETED]: (state, action) => _extends$e({}, state, {
     walletDecryptPending: false,
     walletDecryptSucceded: true,
     walletDecryptResult: action.result
   }),
 
-  [WALLET_DECRYPT_FAILED]: (state, action) => _extends$d({}, state, {
+  [WALLET_DECRYPT_FAILED]: (state, action) => _extends$e({}, state, {
     walletDecryptPending: false,
     walletDecryptSucceded: false,
     walletDecryptResult: action.result
   }),
 
-  [WALLET_UNLOCK_START]: state => _extends$d({}, state, {
+  [WALLET_UNLOCK_START]: state => _extends$e({}, state, {
     walletUnlockPending: true,
     walletUnlockSucceded: null,
     walletUnlockResult: null
   }),
 
-  [WALLET_UNLOCK_COMPLETED]: (state, action) => _extends$d({}, state, {
+  [WALLET_UNLOCK_COMPLETED]: (state, action) => _extends$e({}, state, {
     walletUnlockPending: false,
     walletUnlockSucceded: true,
     walletUnlockResult: action.result
   }),
 
-  [WALLET_UNLOCK_FAILED]: (state, action) => _extends$d({}, state, {
+  [WALLET_UNLOCK_FAILED]: (state, action) => _extends$e({}, state, {
     walletUnlockPending: false,
     walletUnlockSucceded: false,
     walletUnlockResult: action.result
   }),
 
-  [WALLET_LOCK_START]: state => _extends$d({}, state, {
+  [WALLET_LOCK_START]: state => _extends$e({}, state, {
     walletLockPending: false,
     walletLockSucceded: null,
     walletLockResult: null
   }),
 
-  [WALLET_LOCK_COMPLETED]: (state, action) => _extends$d({}, state, {
+  [WALLET_LOCK_COMPLETED]: (state, action) => _extends$e({}, state, {
     walletLockPending: false,
     walletLockSucceded: true,
     walletLockResult: action.result
   }),
 
-  [WALLET_LOCK_FAILED]: (state, action) => _extends$d({}, state, {
+  [WALLET_LOCK_FAILED]: (state, action) => _extends$e({}, state, {
     walletLockPending: false,
     walletLockSucceded: false,
     walletLockResult: action.result
   }),
 
-  [SET_TRANSACTION_LIST_FILTER]: (state, action) => _extends$d({}, state, {
+  [SET_TRANSACTION_LIST_FILTER]: (state, action) => _extends$e({}, state, {
     transactionListFilter: action.data
   }),
 
-  [UPDATE_CURRENT_HEIGHT]: (state, action) => _extends$d({}, state, {
+  [UPDATE_CURRENT_HEIGHT]: (state, action) => _extends$e({}, state, {
     latestBlock: action.data
   }),
-  [WALLET_RESTART]: state => _extends$d({}, state, {
+  [WALLET_RESTART]: state => _extends$e({}, state, {
     walletReconnecting: true
   }),
 
-  [WALLET_RESTART_COMPLETED]: state => _extends$d({}, state, {
+  [WALLET_RESTART_COMPLETED]: state => _extends$e({}, state, {
     walletReconnecting: false
   })
-}, defaultState$5);
-
-var _extends$e = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-const getTimestamp$1 = () => {
-  return Math.floor(Date.now() / 1000);
-};
-
-const defaultState$6 = {
-  builtin: {
-    watchlater: {
-      items: [],
-      id: WATCH_LATER_ID,
-      name: 'Watch Later',
-      updatedAt: getTimestamp$1(),
-      type: COL_TYPE_PLAYLIST
-    },
-    favorites: {
-      items: [],
-      id: FAVORITES_ID,
-      name: 'Favorites',
-      type: COL_TYPE_PLAYLIST,
-      updatedAt: getTimestamp$1()
-    }
-  },
-  resolved: {},
-  unpublished: {}, // sync
-  edited: {},
-  pending: {},
-  saved: [],
-  isResolvingCollectionById: {},
-  error: null
-};
-
-const collectionsReducer = handleActions({
-  [COLLECTION_NEW]: (state, action) => {
-    const { entry: params } = action.data; // { id:, items: Array<string>}
-    // entry
-    const newListTemplate = {
-      id: params.id,
-      name: params.name,
-      items: [],
-      updatedAt: getTimestamp$1(),
-      type: params.type
-    };
-
-    const newList = Object.assign({}, newListTemplate, _extends$e({}, params));
-    const { unpublished: lists } = state;
-    const newLists = Object.assign({}, lists, { [params.id]: newList });
-
-    return _extends$e({}, state, {
-      unpublished: newLists
-    });
-  },
-
-  [COLLECTION_DELETE]: (state, action) => {
-    const { id, collectionKey } = action.data;
-    const { edited: editList, unpublished: unpublishedList, pending: pendingList } = state;
-    const newEditList = Object.assign({}, editList);
-    const newUnpublishedList = Object.assign({}, unpublishedList);
-
-    const newPendingList = Object.assign({}, pendingList);
-
-    if (collectionKey && state[collectionKey] && state[collectionKey][id]) {
-      const newList = Object.assign({}, state[collectionKey]);
-      delete newList[id];
-      return _extends$e({}, state, {
-        [collectionKey]: newList
-      });
-    } else {
-      if (newEditList[id]) {
-        delete newEditList[id];
-      } else if (newUnpublishedList[id]) {
-        delete newUnpublishedList[id];
-      } else if (newPendingList[id]) {
-        delete newPendingList[id];
-      }
-    }
-    return _extends$e({}, state, {
-      edited: newEditList,
-      unpublished: newUnpublishedList,
-      pending: newPendingList
-    });
-  },
-
-  [COLLECTION_PENDING]: (state, action) => {
-    const { localId, claimId } = action.data;
-    const {
-      resolved: resolvedList,
-      edited: editList,
-      unpublished: unpublishedList,
-      pending: pendingList
-    } = state;
-
-    const newEditList = Object.assign({}, editList);
-    const newResolvedList = Object.assign({}, resolvedList);
-    const newUnpublishedList = Object.assign({}, unpublishedList);
-    const newPendingList = Object.assign({}, pendingList);
-
-    if (localId) {
-      // new publish
-      newPendingList[claimId] = Object.assign({}, newUnpublishedList[localId] || {});
-      delete newUnpublishedList[localId];
-    } else {
-      // edit update
-      newPendingList[claimId] = Object.assign({}, newEditList[claimId] || newResolvedList[claimId]);
-      delete newEditList[claimId];
-    }
-
-    return _extends$e({}, state, {
-      edited: newEditList,
-      unpublished: newUnpublishedList,
-      pending: newPendingList
-    });
-  },
-
-  [COLLECTION_EDIT]: (state, action) => {
-    const { id, collectionKey, collection } = action.data;
-
-    if (BUILTIN_LISTS.includes(id)) {
-      const { builtin: lists } = state;
-      return _extends$e({}, state, {
-        [collectionKey]: _extends$e({}, lists, { [id]: collection })
-      });
-    }
-
-    if (collectionKey === 'edited') {
-      const { edited: lists } = state;
-      return _extends$e({}, state, {
-        edited: _extends$e({}, lists, { [id]: collection })
-      });
-    }
-    const { unpublished: lists } = state;
-    return _extends$e({}, state, {
-      unpublished: _extends$e({}, lists, { [id]: collection })
-    });
-  },
-
-  [COLLECTION_ERROR]: (state, action) => {
-    return Object.assign({}, state, {
-      error: action.data.message
-    });
-  },
-
-  [COLLECTION_ITEMS_RESOLVE_STARTED]: (state, action) => {
-    const { ids } = action.data;
-    const { isResolvingCollectionById } = state;
-    const newResolving = Object.assign({}, isResolvingCollectionById);
-    ids.forEach(id => {
-      newResolving[id] = true;
-    });
-    return Object.assign({}, state, _extends$e({}, state, {
-      error: '',
-      isResolvingCollectionById: newResolving
-    }));
-  },
-  [USER_STATE_POPULATE]: (state, action) => {
-    const {
-      builtinCollections,
-      savedCollections,
-      unpublishedCollections,
-      editedCollections
-    } = action.data;
-    return _extends$e({}, state, {
-      edited: editedCollections || state.edited,
-      unpublished: unpublishedCollections || state.unpublished,
-      builtin: builtinCollections || state.builtin,
-      saved: savedCollections || state.saved
-    });
-  },
-  [COLLECTION_ITEMS_RESOLVE_COMPLETED]: (state, action) => {
-    const { resolvedCollections, failedCollectionIds } = action.data;
-    const { pending, edited, isResolvingCollectionById, resolved } = state;
-    const newPending = Object.assign({}, pending);
-    const newEdited = Object.assign({}, edited);
-    const newResolved = Object.assign({}, resolved, resolvedCollections);
-
-    const resolvedIds = Object.keys(resolvedCollections);
-    const newResolving = Object.assign({}, isResolvingCollectionById);
-    if (resolvedCollections && Object.keys(resolvedCollections).length) {
-      resolvedIds.forEach(resolvedId => {
-        if (newEdited[resolvedId]) {
-          if (newEdited[resolvedId]['updatedAt'] < resolvedCollections[resolvedId]['updatedAt']) {
-            delete newEdited[resolvedId];
-          }
-        }
-        delete newResolving[resolvedId];
-        if (newPending[resolvedId]) {
-          delete newPending[resolvedId];
-        }
-      });
-    }
-
-    if (failedCollectionIds && Object.keys(failedCollectionIds).length) {
-      failedCollectionIds.forEach(failedId => {
-        delete newResolving[failedId];
-      });
-    }
-
-    return Object.assign({}, state, _extends$e({}, state, {
-      pending: newPending,
-      resolved: newResolved,
-      edited: newEdited,
-      isResolvingCollectionById: newResolving
-    }));
-  },
-  [COLLECTION_ITEMS_RESOLVE_FAILED]: (state, action) => {
-    const { ids } = action.data;
-    const { isResolvingCollectionById } = state;
-    const newResolving = Object.assign({}, isResolvingCollectionById);
-    ids.forEach(id => {
-      delete newResolving[id];
-    });
-    return Object.assign({}, state, _extends$e({}, state, {
-      isResolvingCollectionById: newResolving,
-      error: action.data.message
-    }));
-  }
 }, defaultState$6);
 
 //      
 
-const selectState$5 = state => state.content || {};
+const selectState$4 = state => state.content || {};
 
-const makeSelectContentPositionForUri = uri => reselect.createSelector(selectState$5, makeSelectClaimForUri(uri), (state, claim) => {
+const makeSelectContentPositionForUri = uri => reselect.createSelector(selectState$4, makeSelectClaimForUri(uri), (state, claim) => {
   if (!claim) {
     return null;
   }
@@ -7920,9 +6079,9 @@ const makeSelectContentPositionForUri = uri => reselect.createSelector(selectSta
 
 var _extends$f = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-const selectState$6 = state => state.notifications || {};
+const selectState$5 = state => state.notifications || {};
 
-const selectToast = reselect.createSelector(selectState$6, state => {
+const selectToast = reselect.createSelector(selectState$5, state => {
   if (state.toasts.length) {
     const { id, params } = state.toasts[0];
     return _extends$f({
@@ -7933,7 +6092,7 @@ const selectToast = reselect.createSelector(selectState$6, state => {
   return null;
 });
 
-const selectError = reselect.createSelector(selectState$6, state => {
+const selectError = reselect.createSelector(selectState$5, state => {
   if (state.errors.length) {
     const { error } = state.errors[0];
     return {
@@ -7944,10 +6103,36 @@ const selectError = reselect.createSelector(selectState$6, state => {
   return null;
 });
 
+//      
+
+const selectState$6 = state => state.tags || {};
+
+const selectKnownTagsByName = reselect.createSelector(selectState$6, state => state.knownTags);
+
+const selectFollowedTagsList = reselect.createSelector(selectState$6, state => state.followedTags.filter(tag => typeof tag === 'string'));
+
+const selectFollowedTags = reselect.createSelector(selectFollowedTagsList, followedTags => followedTags.map(tag => ({ name: tag.toLowerCase() })).sort((a, b) => a.name.localeCompare(b.name)));
+
+const selectUnfollowedTags = reselect.createSelector(selectKnownTagsByName, selectFollowedTagsList, (tagsByName, followedTags) => {
+  const followedTagsSet = new Set(followedTags);
+  let tagsToReturn = [];
+  Object.keys(tagsByName).forEach(key => {
+    if (!followedTagsSet.has(key)) {
+      const { name } = tagsByName[key];
+      tagsToReturn.push({ name: name.toLowerCase() });
+    }
+  });
+
+  return tagsToReturn;
+});
+
+const makeSelectIsFollowingTag = tag => reselect.createSelector(selectFollowedTags, followedTags => {
+  return followedTags.some(followedTag => followedTag.name === tag.toLowerCase());
+});
+
 exports.ABANDON_STATES = abandon_states;
 exports.ACTIONS = action_types;
 exports.CLAIM_VALUES = claim;
-exports.COLLECTIONS_CONSTS = collections;
 exports.DAEMON_SETTINGS = daemon_settings;
 exports.DEFAULT_FOLLOWED_TAGS = DEFAULT_FOLLOWED_TAGS;
 exports.DEFAULT_KNOWN_TAGS = DEFAULT_KNOWN_TAGS;
@@ -7969,13 +6154,13 @@ exports.batchActions = batchActions;
 exports.buildSharedStateMiddleware = buildSharedStateMiddleware;
 exports.buildURI = buildURI;
 exports.claimsReducer = claimsReducer;
-exports.collectionsReducer = collectionsReducer;
 exports.contentReducer = contentReducer;
 exports.convertToShareLink = convertToShareLink;
 exports.createNormalizedClaimSearchKey = createNormalizedClaimSearchKey;
 exports.creditsToString = creditsToString;
 exports.doAbandonClaim = doAbandonClaim;
 exports.doAbandonTxo = doAbandonTxo;
+exports.doAddTag = doAddTag;
 exports.doBalanceSubscribe = doBalanceSubscribe;
 exports.doCheckAddressIsMine = doCheckAddressIsMine;
 exports.doCheckPendingClaims = doCheckPendingClaims;
@@ -7987,30 +6172,22 @@ exports.doClearPublish = doClearPublish;
 exports.doClearPurchasedUriSuccess = doClearPurchasedUriSuccess;
 exports.doClearRepostError = doClearRepostError;
 exports.doClearSupport = doClearSupport;
-exports.doCollectionDelete = doCollectionDelete;
-exports.doCollectionEdit = doCollectionEdit;
-exports.doCollectionPublish = doCollectionPublish;
-exports.doCollectionPublishUpdate = doCollectionPublishUpdate;
 exports.doCreateChannel = doCreateChannel;
+exports.doDeleteTag = doDeleteTag;
 exports.doDismissError = doDismissError;
 exports.doDismissToast = doDismissToast;
 exports.doError = doError;
 exports.doFetchChannelListMine = doFetchChannelListMine;
 exports.doFetchClaimListMine = doFetchClaimListMine;
 exports.doFetchClaimsByChannel = doFetchClaimsByChannel;
-exports.doFetchCollectionListMine = doFetchCollectionListMine;
 exports.doFetchFileInfo = doFetchFileInfo;
 exports.doFetchFileInfos = doFetchFileInfos;
-exports.doFetchItemsInCollection = doFetchItemsInCollection;
-exports.doFetchItemsInCollections = doFetchItemsInCollections;
 exports.doFetchTransactions = doFetchTransactions;
 exports.doFetchTxoPage = doFetchTxoPage;
-exports.doFetchUtxoCounts = doFetchUtxoCounts;
 exports.doFileGet = doFileGet;
 exports.doFileList = doFileList;
 exports.doGetNewAddress = doGetNewAddress;
 exports.doImportChannel = doImportChannel;
-exports.doLocalCollectionCreate = doLocalCollectionCreate;
 exports.doPopulateSharedUserState = doPopulateSharedUserState;
 exports.doPreferenceGet = doPreferenceGet;
 exports.doPreferenceSet = doPreferenceSet;
@@ -8029,15 +6206,14 @@ exports.doSetDraftTransactionAmount = doSetDraftTransactionAmount;
 exports.doSetFileListSort = doSetFileListSort;
 exports.doSetTransactionListFilter = doSetTransactionListFilter;
 exports.doSupportAbandonForClaim = doSupportAbandonForClaim;
-exports.doTipClaimMass = doTipClaimMass;
 exports.doToast = doToast;
+exports.doToggleTagFollow = doToggleTagFollow;
 exports.doUpdateBalance = doUpdateBalance;
 exports.doUpdateBlockHeight = doUpdateBlockHeight;
 exports.doUpdateChannel = doUpdateChannel;
 exports.doUpdatePublishForm = doUpdatePublishForm;
 exports.doUpdateTxoPageParams = doUpdateTxoPageParams;
 exports.doUploadThumbnail = doUploadThumbnail;
-exports.doUtxoConsolidate = doUtxoConsolidate;
 exports.doWalletDecrypt = doWalletDecrypt;
 exports.doWalletEncrypt = doWalletEncrypt;
 exports.doWalletReconnect = doWalletReconnect;
@@ -8049,75 +6225,51 @@ exports.formatFullPrice = formatFullPrice;
 exports.isClaimNsfw = isClaimNsfw;
 exports.isNameValid = isNameValid;
 exports.isURIClaimable = isURIClaimable;
-exports.isURIEqual = isURIEqual;
 exports.isURIValid = isURIValid;
 exports.makeSelectAbandoningClaimById = makeSelectAbandoningClaimById;
 exports.makeSelectAmountForUri = makeSelectAmountForUri;
 exports.makeSelectCanonicalUrlForUri = makeSelectCanonicalUrlForUri;
 exports.makeSelectChannelForClaimUri = makeSelectChannelForClaimUri;
-exports.makeSelectChannelPermUrlForClaimUri = makeSelectChannelPermUrlForClaimUri;
-exports.makeSelectClaimForClaimId = makeSelectClaimForClaimId;
 exports.makeSelectClaimForUri = makeSelectClaimForUri;
-exports.makeSelectClaimHasSource = makeSelectClaimHasSource;
-exports.makeSelectClaimIdForUri = makeSelectClaimIdForUri;
-exports.makeSelectClaimIdIsPending = makeSelectClaimIdIsPending;
-exports.makeSelectClaimIdsForCollectionId = makeSelectClaimIdsForCollectionId;
 exports.makeSelectClaimIsMine = makeSelectClaimIsMine;
 exports.makeSelectClaimIsNsfw = makeSelectClaimIsNsfw;
 exports.makeSelectClaimIsPending = makeSelectClaimIsPending;
-exports.makeSelectClaimIsStreamPlaceholder = makeSelectClaimIsStreamPlaceholder;
-exports.makeSelectClaimUrlInCollection = makeSelectClaimUrlInCollection;
 exports.makeSelectClaimWasPurchased = makeSelectClaimWasPurchased;
+exports.makeSelectClaimsInChannelForCurrentPageState = makeSelectClaimsInChannelForCurrentPageState;
 exports.makeSelectClaimsInChannelForPage = makeSelectClaimsInChannelForPage;
-exports.makeSelectCollectionForId = makeSelectCollectionForId;
-exports.makeSelectCollectionForIdHasClaimUrl = makeSelectCollectionForIdHasClaimUrl;
-exports.makeSelectCollectionIsMine = makeSelectCollectionIsMine;
 exports.makeSelectContentPositionForUri = makeSelectContentPositionForUri;
 exports.makeSelectContentTypeForUri = makeSelectContentTypeForUri;
-exports.makeSelectCountForCollectionId = makeSelectCountForCollectionId;
 exports.makeSelectCoverForUri = makeSelectCoverForUri;
 exports.makeSelectDateForUri = makeSelectDateForUri;
 exports.makeSelectDownloadPathForUri = makeSelectDownloadPathForUri;
 exports.makeSelectDownloadingForUri = makeSelectDownloadingForUri;
-exports.makeSelectEditedCollectionForId = makeSelectEditedCollectionForId;
-exports.makeSelectEffectiveAmountForUri = makeSelectEffectiveAmountForUri;
 exports.makeSelectFetchingChannelClaims = makeSelectFetchingChannelClaims;
 exports.makeSelectFileInfoForUri = makeSelectFileInfoForUri;
 exports.makeSelectFileNameForUri = makeSelectFileNameForUri;
 exports.makeSelectFilePartlyDownloaded = makeSelectFilePartlyDownloaded;
 exports.makeSelectFilteredTransactionsForPage = makeSelectFilteredTransactionsForPage;
-exports.makeSelectIndexForUrlInCollection = makeSelectIndexForUrlInCollection;
 exports.makeSelectIsAbandoningClaimForUri = makeSelectIsAbandoningClaimForUri;
-exports.makeSelectIsResolvingCollectionForId = makeSelectIsResolvingCollectionForId;
+exports.makeSelectIsFollowingTag = makeSelectIsFollowingTag;
 exports.makeSelectIsUriResolving = makeSelectIsUriResolving;
 exports.makeSelectLatestTransactions = makeSelectLatestTransactions;
 exports.makeSelectLoadingForUri = makeSelectLoadingForUri;
 exports.makeSelectMediaTypeForUri = makeSelectMediaTypeForUri;
 exports.makeSelectMetadataForUri = makeSelectMetadataForUri;
 exports.makeSelectMetadataItemForUri = makeSelectMetadataItemForUri;
-exports.makeSelectMyChannelPermUrlForName = makeSelectMyChannelPermUrlForName;
-exports.makeSelectMyPublishedCollectionForId = makeSelectMyPublishedCollectionForId;
 exports.makeSelectMyPurchasesForPage = makeSelectMyPurchasesForPage;
 exports.makeSelectMyStreamUrlsForPage = makeSelectMyStreamUrlsForPage;
-exports.makeSelectNameForCollectionId = makeSelectNameForCollectionId;
-exports.makeSelectNextUrlForCollectionAndUrl = makeSelectNextUrlForCollectionAndUrl;
+exports.makeSelectNsfwCountForChannel = makeSelectNsfwCountForChannel;
 exports.makeSelectNsfwCountFromUris = makeSelectNsfwCountFromUris;
 exports.makeSelectOmittedCountForChannel = makeSelectOmittedCountForChannel;
 exports.makeSelectPendingAmountByUri = makeSelectPendingAmountByUri;
-exports.makeSelectPendingClaimForUri = makeSelectPendingClaimForUri;
-exports.makeSelectPendingCollectionForId = makeSelectPendingCollectionForId;
 exports.makeSelectPermanentUrlForUri = makeSelectPermanentUrlForUri;
-exports.makeSelectPreviousUrlForCollectionAndUrl = makeSelectPreviousUrlForCollectionAndUrl;
 exports.makeSelectPublishFormValue = makeSelectPublishFormValue;
-exports.makeSelectPublishedCollectionForId = makeSelectPublishedCollectionForId;
 exports.makeSelectReflectingClaimForUri = makeSelectReflectingClaimForUri;
 exports.makeSelectSearchDownloadUrlsCount = makeSelectSearchDownloadUrlsCount;
 exports.makeSelectSearchDownloadUrlsForPage = makeSelectSearchDownloadUrlsForPage;
 exports.makeSelectShortUrlForUri = makeSelectShortUrlForUri;
-exports.makeSelectStakedLevelForChannelUri = makeSelectStakedLevelForChannelUri;
 exports.makeSelectStreamingUrlForUri = makeSelectStreamingUrlForUri;
 exports.makeSelectSupportsForUri = makeSelectSupportsForUri;
-exports.makeSelectTagInClaimOrChannelForUri = makeSelectTagInClaimOrChannelForUri;
 exports.makeSelectTagsForUri = makeSelectTagsForUri;
 exports.makeSelectThumbnailForUri = makeSelectThumbnailForUri;
 exports.makeSelectTitleForUri = makeSelectTitleForUri;
@@ -8125,10 +6277,7 @@ exports.makeSelectTotalClaimsInChannelSearch = makeSelectTotalClaimsInChannelSea
 exports.makeSelectTotalItemsForChannel = makeSelectTotalItemsForChannel;
 exports.makeSelectTotalPagesForChannel = makeSelectTotalPagesForChannel;
 exports.makeSelectTotalPagesInChannelSearch = makeSelectTotalPagesInChannelSearch;
-exports.makeSelectTotalStakedAmountForChannelUri = makeSelectTotalStakedAmountForChannelUri;
-exports.makeSelectUnpublishedCollectionForId = makeSelectUnpublishedCollectionForId;
 exports.makeSelectUriIsStreamable = makeSelectUriIsStreamable;
-exports.makeSelectUrlsForCollectionId = makeSelectUrlsForCollectionId;
 exports.normalizeURI = normalizeURI;
 exports.notificationsReducer = notificationsReducer;
 exports.parseQueryParams = parseQueryParams;
@@ -8144,7 +6293,6 @@ exports.selectAllFetchingChannelClaims = selectAllFetchingChannelClaims;
 exports.selectAllMyClaimsByOutpoint = selectAllMyClaimsByOutpoint;
 exports.selectBalance = selectBalance;
 exports.selectBlocks = selectBlocks;
-exports.selectBuiltinCollections = selectBuiltinCollections;
 exports.selectChannelClaimCounts = selectChannelClaimCounts;
 exports.selectChannelImportPending = selectChannelImportPending;
 exports.selectClaimIdsByUri = selectClaimIdsByUri;
@@ -8154,9 +6302,7 @@ exports.selectClaimsBalance = selectClaimsBalance;
 exports.selectClaimsById = selectClaimsById;
 exports.selectClaimsByUri = selectClaimsByUri;
 exports.selectCreateChannelError = selectCreateChannelError;
-exports.selectCreateCollectionError = selectCreateCollectionError;
 exports.selectCreatingChannel = selectCreatingChannel;
-exports.selectCreatingCollection = selectCreatingCollection;
 exports.selectCurrentChannelPage = selectCurrentChannelPage;
 exports.selectDownloadUrlsCount = selectDownloadUrlsCount;
 exports.selectDownloadedUris = selectDownloadedUris;
@@ -8171,7 +6317,6 @@ exports.selectFetchingClaimSearch = selectFetchingClaimSearch;
 exports.selectFetchingClaimSearchByQuery = selectFetchingClaimSearchByQuery;
 exports.selectFetchingMyChannels = selectFetchingMyChannels;
 exports.selectFetchingMyClaimsPageError = selectFetchingMyClaimsPageError;
-exports.selectFetchingMyCollections = selectFetchingMyCollections;
 exports.selectFetchingMyPurchasesError = selectFetchingMyPurchasesError;
 exports.selectFetchingTxosError = selectFetchingTxosError;
 exports.selectFileInfosByOutpoint = selectFileInfosByOutpoint;
@@ -8180,17 +6325,16 @@ exports.selectFileListDownloadedSort = selectFileListDownloadedSort;
 exports.selectFileListPublishedSort = selectFileListPublishedSort;
 exports.selectFilteredTransactionCount = selectFilteredTransactionCount;
 exports.selectFilteredTransactions = selectFilteredTransactions;
+exports.selectFollowedTags = selectFollowedTags;
+exports.selectFollowedTagsList = selectFollowedTagsList;
 exports.selectGettingNewAddress = selectGettingNewAddress;
 exports.selectHasTransactions = selectHasTransactions;
-exports.selectIsConsolidatingUtxos = selectIsConsolidatingUtxos;
 exports.selectIsFetchingClaimListMine = selectIsFetchingClaimListMine;
 exports.selectIsFetchingFileList = selectIsFetchingFileList;
 exports.selectIsFetchingFileListDownloadedOrPublished = selectIsFetchingFileListDownloadedOrPublished;
 exports.selectIsFetchingMyPurchases = selectIsFetchingMyPurchases;
 exports.selectIsFetchingTransactions = selectIsFetchingTransactions;
 exports.selectIsFetchingTxos = selectIsFetchingTxos;
-exports.selectIsFetchingUtxoCounts = selectIsFetchingUtxoCounts;
-exports.selectIsMassClaimingTips = selectIsMassClaimingTips;
 exports.selectIsResolvingPublishUris = selectIsResolvingPublishUris;
 exports.selectIsSendingSupport = selectIsSendingSupport;
 exports.selectIsStillEditing = selectIsStillEditing;
@@ -8207,20 +6351,9 @@ exports.selectMyClaimsPageItemCount = selectMyClaimsPageItemCount;
 exports.selectMyClaimsPageNumber = selectMyClaimsPageNumber;
 exports.selectMyClaimsRaw = selectMyClaimsRaw;
 exports.selectMyClaimsWithoutChannels = selectMyClaimsWithoutChannels;
-exports.selectMyCollectionIds = selectMyCollectionIds;
-exports.selectMyEditedCollections = selectMyEditedCollections;
-exports.selectMyPublishedCollections = selectMyPublishedCollections;
-exports.selectMyPublishedMixedCollections = selectMyPublishedMixedCollections;
-exports.selectMyPublishedPlaylistCollections = selectMyPublishedPlaylistCollections;
 exports.selectMyPurchases = selectMyPurchases;
 exports.selectMyPurchasesCount = selectMyPurchasesCount;
 exports.selectMyStreamUrlsCount = selectMyStreamUrlsCount;
-exports.selectMyUnpublishedCollections = selectMyUnpublishedCollections;
-exports.selectPendingClaims = selectPendingClaims;
-exports.selectPendingConsolidateTxid = selectPendingConsolidateTxid;
-exports.selectPendingIds = selectPendingIds;
-exports.selectPendingMassClaimTxid = selectPendingMassClaimTxid;
-exports.selectPendingOtherTransactions = selectPendingOtherTransactions;
 exports.selectPendingSupportTransactions = selectPendingSupportTransactions;
 exports.selectPlayingUri = selectPlayingUri;
 exports.selectPublishFormValues = selectPublishFormValues;
@@ -8231,9 +6364,7 @@ exports.selectReflectingById = selectReflectingById;
 exports.selectRepostError = selectRepostError;
 exports.selectRepostLoading = selectRepostLoading;
 exports.selectReservedBalance = selectReservedBalance;
-exports.selectResolvedCollections = selectResolvedCollections;
 exports.selectResolvingUris = selectResolvingUris;
-exports.selectSavedCollectionIds = selectSavedCollectionIds;
 exports.selectSupportsBalance = selectSupportsBalance;
 exports.selectSupportsByOutpoint = selectSupportsByOutpoint;
 exports.selectTakeOverAmount = selectTakeOverAmount;
@@ -8245,17 +6376,14 @@ exports.selectTotalSupports = selectTotalSupports;
 exports.selectTransactionItems = selectTransactionItems;
 exports.selectTransactionListFilter = selectTransactionListFilter;
 exports.selectTransactionsById = selectTransactionsById;
-exports.selectTransactionsFile = selectTransactionsFile;
 exports.selectTxoItemCount = selectTxoItemCount;
 exports.selectTxoPage = selectTxoPage;
 exports.selectTxoPageNumber = selectTxoPageNumber;
 exports.selectTxoPageParams = selectTxoPageParams;
+exports.selectUnfollowedTags = selectUnfollowedTags;
 exports.selectUpdateChannelError = selectUpdateChannelError;
-exports.selectUpdateCollectionError = selectUpdateCollectionError;
 exports.selectUpdatingChannel = selectUpdatingChannel;
-exports.selectUpdatingCollection = selectUpdatingCollection;
 exports.selectUrisLoading = selectUrisLoading;
-exports.selectUtxoCounts = selectUtxoCounts;
 exports.selectWalletDecryptPending = selectWalletDecryptPending;
 exports.selectWalletDecryptResult = selectWalletDecryptResult;
 exports.selectWalletDecryptSucceeded = selectWalletDecryptSucceeded;
@@ -8267,6 +6395,6 @@ exports.selectWalletState = selectWalletState;
 exports.selectWalletUnlockPending = selectWalletUnlockPending;
 exports.selectWalletUnlockResult = selectWalletUnlockResult;
 exports.selectWalletUnlockSucceeded = selectWalletUnlockSucceeded;
-exports.splitBySeparator = splitBySeparator;
+exports.tagsReducer = tagsReducer;
 exports.toQueryString = toQueryString;
 exports.walletReducer = walletReducer;
diff --git a/dist/flow-typed/Claim.js b/dist/flow-typed/Claim.js
index e03eeae..0b97c0e 100644
--- a/dist/flow-typed/Claim.js
+++ b/dist/flow-typed/Claim.js
@@ -1,15 +1,11 @@
 // @flow
 
-declare type Claim = StreamClaim | ChannelClaim | CollectionClaim;
+declare type Claim = StreamClaim | ChannelClaim;
 
 declare type ChannelClaim = GenericClaim & {
   value: ChannelMetadata,
 };
 
-declare type CollectionClaim = GenericClaim & {
-  value: CollectionMetadata,
-};
-
 declare type StreamClaim = GenericClaim & {
   value: StreamMetadata,
 };
@@ -34,12 +30,9 @@ declare type GenericClaim = {
   short_url: string, // permanent_url with short id, no channel
   txid: string, // unique tx id
   type: 'claim' | 'update' | 'support',
-  value_type: 'stream' | 'channel' | 'collection',
+  value_type: 'stream' | 'channel',
   signing_channel?: ChannelClaim,
-  reposted_claim?: GenericClaim,
   repost_channel_url?: string,
-  repost_url?: string,
-  repost_bid_amount?: string,
   purchase_receipt?: PurchaseReceipt,
   meta: {
     activation_height: number,
@@ -78,10 +71,6 @@ declare type ChannelMetadata = GenericMetadata & {
   featured?: Array<string>,
 };
 
-declare type CollectionMetadata = GenericMetadata & {
-  claims: Array<string>,
-}
-
 declare type StreamMetadata = GenericMetadata & {
   license?: string, // License "title" ex: Creative Commons, Custom copyright
   license_url?: string, // Link to full license
@@ -144,71 +133,3 @@ declare type PurchaseReceipt = {
   txid: string,
   type: 'purchase',
 };
-
-declare type ClaimActionResolveInfo = {
-  [string]: {
-    stream: ?StreamClaim,
-    channel: ?ChannelClaim,
-    claimsInChannel: ?number,
-    collection: ?CollectionClaim,
-  },
-}
-
-declare type ChannelUpdateParams = {
-  claim_id: string,
-  bid?: string,
-  title?: string,
-  cover_url?: string,
-  thumbnail_url?: string,
-  description?: string,
-  website_url?: string,
-  email?: string,
-  tags?: Array<string>,
-  replace?: boolean,
-  languages?: Array<string>,
-  locations?: Array<string>,
-  blocking?: boolean,
-}
-
-declare type ChannelPublishParams = {
-  name: string,
-  bid: string,
-  blocking?: true,
-  title?: string,
-  cover_url?: string,
-  thumbnail_url?: string,
-  description?: string,
-  website_url?: string,
-  email?: string,
-  tags?: Array<string>,
-  languages?: Array<string>,
-}
-
-declare type CollectionUpdateParams = {
-  claim_id: string,
-  claim_ids?: Array<string>,
-  bid?: string,
-  title?: string,
-  cover_url?: string,
-  thumbnail_url?: string,
-  description?: string,
-  website_url?: string,
-  email?: string,
-  tags?: Array<string>,
-  replace?: boolean,
-  languages?: Array<string>,
-  locations?: Array<string>,
-  blocking?: boolean,
-}
-
-declare type CollectionPublishParams = {
-  name: string,
-  bid: string,
-  claim_ids: Array<string>,
-  blocking?: true,
-  title?: string,
-  thumbnail_url?: string,
-  description?: string,
-  tags?: Array<string>,
-  languages?: Array<string>,
-}
diff --git a/dist/flow-typed/CoinSwap.js b/dist/flow-typed/CoinSwap.js
deleted file mode 100644
index a41c571..0000000
--- a/dist/flow-typed/CoinSwap.js
+++ /dev/null
@@ -1,29 +0,0 @@
-declare type CoinSwapInfo = {
-  chargeCode: string,
-  coins: Array<string>,
-  sendAddresses: { [string]: string},
-  sendAmounts: { [string]: any },
-  lbcAmount: number,
-  status?: {
-    status: string,
-    receiptCurrency: string,
-    receiptTxid: string,
-    lbcTxid: string,
-  },
-}
-
-declare type CoinSwapState = {
-  coinSwaps: Array<CoinSwapInfo>,
-};
-
-declare type CoinSwapAddAction = {
-  type: string,
-  data: CoinSwapInfo,
-};
-
-declare type CoinSwapRemoveAction = {
-  type: string,
-  data: {
-    chargeCode: string,
-  },
-};
diff --git a/dist/flow-typed/Collections.js b/dist/flow-typed/Collections.js
deleted file mode 100644
index f70825a..0000000
--- a/dist/flow-typed/Collections.js
+++ /dev/null
@@ -1,34 +0,0 @@
-declare type Collection = {
-  id: string,
-  items: Array<?string>,
-  name: string,
-  type: string,
-  updatedAt: number,
-  totalItems?: number,
-  sourceId?: string, // if copied, claimId of original collection
-};
-
-declare type CollectionState = {
-  unpublished: CollectionGroup,
-  resolved: CollectionGroup,
-  pending: CollectionGroup,
-  edited: CollectionGroup,
-  builtin: CollectionGroup,
-  saved: Array<string>,
-  isResolvingCollectionById: { [string]: boolean },
-  error?: string | null,
-};
-
-declare type CollectionGroup = {
-  [string]: Collection,
-}
-
-declare type CollectionEditParams = {
-  claims?: Array<Claim>,
-  remove?: boolean,
-  claimIds?: Array<string>,
-  replace?: boolean,
-  order?: { from: number, to: number },
-  type?: string,
-  name?: string,
-}
diff --git a/dist/flow-typed/Comment.js b/dist/flow-typed/Comment.js
new file mode 100644
index 0000000..64ea974
--- /dev/null
+++ b/dist/flow-typed/Comment.js
@@ -0,0 +1,23 @@
+declare type Comment = {
+  comment: string, // comment body
+  comment_id: string, // sha256 digest
+  claim_id: string, // id linking to the claim this comment
+  timestamp: number, // integer representing unix-time
+  is_hidden: boolean, // claim owner may enable/disable this
+  channel_id?: string,  // claimId of channel signing this comment
+  channel_name?: string,  // name of channel claim
+  channel_url?: string, // full lbry url to signing channel
+  signature?: string, // signature of comment by originating channel
+  signing_ts?: string, // timestamp used when signing this comment
+  is_channel_signature_valid?: boolean, // whether or not the signature could be validated
+  parent_id?: number, // comment_id of comment this is in reply to
+};
+
+// todo: relate individual comments to their commentId
+declare type CommentsState = {
+  commentsByUri: { [string]: string },
+  byId: { [string]: Array<string> },
+  commentById: { [string]: Comment },
+  isLoading: boolean,
+  myComments: ?Set<string>,
+};
diff --git a/dist/flow-typed/Lbry.js b/dist/flow-typed/Lbry.js
index 2fd2ac6..d7c0430 100644
--- a/dist/flow-typed/Lbry.js
+++ b/dist/flow-typed/Lbry.js
@@ -7,6 +7,10 @@ declare type StatusResponse = {
     download_progress: number,
     downloading_headers: boolean,
   },
+  connection_status: {
+    code: string,
+    message: string,
+  },
   dht: {
     node_id: string,
     peers_in_routing_table: number,
@@ -41,7 +45,6 @@ declare type StatusResponse = {
     redirects: {},
   },
   wallet: ?{
-    connected: string,
     best_blockhash: string,
     blocks: number,
     blocks_behind: number,
@@ -75,7 +78,7 @@ declare type BalanceResponse = {
 
 declare type ResolveResponse = {
   // Keys are the url(s) passed to resolve
-  [string]: { error?: {}, stream?: StreamClaim, channel?: ChannelClaim, collection?: CollectionClaim, claimsInChannel?: number },
+  [string]: { error?: {}, stream?: StreamClaim, channel?: ChannelClaim, claimsInChannel?: number },
 };
 
 declare type GetResponse = FileListItem & { error?: string };
@@ -124,22 +127,12 @@ declare type ChannelUpdateResponse = GenericTxResponse & {
 declare type CommentCreateResponse = Comment;
 declare type CommentUpdateResponse = Comment;
 
-declare type MyReactions = {
-  // Keys are the commentId
-  [string]: Array<string>,
-};
-
-declare type OthersReactions = {
-  // Keys are the commentId
-  [string]: {
-    // Keys are the reaction_type, e.g. 'like'
-    [string]: number,
-  },
-};
-
-declare type CommentReactListResponse = {
-  my_reactions: Array<MyReactions>,
-  others_reactions: Array<OthersReactions>,
+declare type CommentListResponse = {
+  items: Array<Comment>,
+  page: number,
+  page_size: number,
+  total_items: number,
+  total_pages: number,
 };
 
 declare type CommentHideResponse = {
@@ -147,11 +140,6 @@ declare type CommentHideResponse = {
   [string]: { hidden: boolean },
 };
 
-declare type CommentPinResponse = {
-  // keyed by the CommentIds entered
-  items: Comment,
-};
-
 declare type CommentAbandonResponse = {
   // keyed by the CommentId given
   abandoned: boolean,
@@ -165,42 +153,6 @@ declare type ChannelListResponse = {
   total_pages: number,
 };
 
-declare type ChannelSignResponse = {
-  signature: string,
-  signing_ts: string,
-};
-
-declare type CollectionCreateResponse = {
-  outputs: Array<Claim>,
-  page: number,
-  page_size: number,
-  total_items: number,
-  total_pages: number,
-}
-
-declare type CollectionListResponse = {
-  items: Array<Claim>,
-  page: number,
-  page_size: number,
-  total_items: number,
-  total_pages: number,
-};
-
-declare type CollectionResolveResponse = {
-  items: Array<Claim>,
-  total_items: number,
-};
-
-declare type CollectionResolveOptions = {
-  claim_id: string,
-};
-
-declare type CollectionListOptions = {
-  page: number,
-  page_size: number,
-  resolve?: boolean,
-};
-
 declare type FileListResponse = {
   items: Array<FileListItem>,
   page: number,
@@ -257,7 +209,7 @@ declare type StreamRepostOptions = {
   name: string,
   bid: string,
   claim_id: string,
-  channel_id?: string,
+  channel_id: string,
 };
 
 declare type StreamRepostResponse = GenericTxResponse;
@@ -310,7 +262,6 @@ declare type LbryTypes = {
   channel_update: (params: {}) => Promise<ChannelUpdateResponse>,
   channel_import: (params: {}) => Promise<string>,
   channel_list: (params: {}) => Promise<ChannelListResponse>,
-  channel_sign: (params: {}) => Promise<ChannelSignResponse>,
   stream_abandon: (params: {}) => Promise<GenericTxResponse>,
   stream_list: (params: {}) => Promise<StreamListResponse>,
   channel_abandon: (params: {}) => Promise<GenericTxResponse>,
@@ -319,10 +270,6 @@ declare type LbryTypes = {
   support_abandon: (params: {}) => Promise<SupportAbandonResponse>,
   stream_repost: (params: StreamRepostOptions) => Promise<StreamRepostResponse>,
   purchase_list: (params: PurchaseListOptions) => Promise<PurchaseListResponse>,
-  collection_resolve: (params: CollectionResolveOptions) => Promise<CollectionResolveResponse>,
-  collection_list: (params: CollectionListOptions) => Promise<CollectionListResponse>,
-  collection_create: (params: {}) => Promise<CollectionCreateResponse>,
-  collection_update: (params: {}) => Promise<CollectionCreateResponse>,
 
   // File fetching and manipulation
   file_list: (params: {}) => Promise<FileListResponse>,
@@ -335,6 +282,8 @@ declare type LbryTypes = {
   preference_set: (params: {}) => Promise<any>,
 
   // Commenting
+  comment_list: (params: {}) => Promise<CommentListResponse>,
+  comment_create: (params: {}) => Promise<CommentCreateResponse>,
   comment_update: (params: {}) => Promise<CommentUpdateResponse>,
   comment_hide: (params: {}) => Promise<CommentHideResponse>,
   comment_abandon: (params: {}) => Promise<CommentAbandonResponse>,
@@ -351,7 +300,6 @@ declare type LbryTypes = {
   address_unused: (params: {}) => Promise<string>, // New address
   address_list: (params: {}) => Promise<string>,
   transaction_list: (params: {}) => Promise<TxListResponse>,
-  txo_list: (params: {}) => Promise<any>,
 
   // Sync
   sync_hash: (params: {}) => Promise<string>,
diff --git a/dist/flow-typed/Txo.js b/dist/flow-typed/Txo.js
index c4ab9b6..5950c99 100644
--- a/dist/flow-typed/Txo.js
+++ b/dist/flow-typed/Txo.js
@@ -10,9 +10,6 @@ declare type Txo = {
   is_my_output: boolean,
   is_my_input: boolean,
   is_spent: boolean,
-  signing_channel?: {
-    channel_id: string,
-  },
 };
 
 declare type TxoListParams = {
@@ -24,4 +21,4 @@ declare type TxoListParams = {
   is_not_my_input?: boolean,
   is_not_my_output?: boolean,
   is_spent?: boolean,
-};
+}
diff --git a/dist/flow-typed/npm/from-entries.js b/dist/flow-typed/npm/from-entries.js
deleted file mode 100644
index ce92b81..0000000
--- a/dist/flow-typed/npm/from-entries.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// @flow
-
-declare module '@ungap/from-entries' {
-  declare module.exports: any;
-}
diff --git a/dist/flow-typed/npm/uuid.js b/dist/flow-typed/npm/uuid.js
deleted file mode 100644
index 5760b38..0000000
--- a/dist/flow-typed/npm/uuid.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// @flow
-
-declare module 'uuid' {
-  declare module.exports: any;
-}
diff --git a/dist/flow-typed/npm/uuid_v3.x.x.js b/dist/flow-typed/npm/uuid_v3.x.x.js
new file mode 100644
index 0000000..bf8d507
--- /dev/null
+++ b/dist/flow-typed/npm/uuid_v3.x.x.js
@@ -0,0 +1,102 @@
+// flow-typed signature: 3cf668e64747095cab0bb360cf2fb34f
+// flow-typed version: d659bd0cb8/uuid_v3.x.x/flow_>=v0.32.x
+
+declare module "uuid" {
+  declare class uuid {
+    static (
+      options?: {|
+        random?: number[],
+        rng?: () => number[] | Buffer
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+    static v1(
+      options?: {|
+        node?: number[],
+        clockseq?: number,
+        msecs?: number | Date,
+        nsecs?: number
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+    static v4(
+      options?: {|
+        random?: number[],
+        rng?: () => number[] | Buffer
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string
+  }
+  declare module.exports: Class<uuid>;
+}
+
+declare module "uuid/v1" {
+  declare class v1 {
+    static (
+      options?: {|
+        node?: number[],
+        clockseq?: number,
+        msecs?: number | Date,
+        nsecs?: number
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string
+  }
+
+  declare module.exports: Class<v1>;
+}
+
+declare module "uuid/v3" {
+  declare class v3 {
+    static (
+      name?: string | number[],
+      namespace?: string | number[],
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+     static name: string,
+     static DNS: string,
+     static URL: string
+  }
+
+  declare module.exports: Class<v3>;
+}
+
+declare module "uuid/v4" {
+  declare class v4 {
+    static (
+      options?: {|
+        random?: number[],
+        rng?: () => number[] | Buffer
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string
+  }
+
+  declare module.exports: Class<v4>;
+}
+
+declare module "uuid/v5" {
+  declare class v5 {
+    static (
+      name?: string | number[],
+      namespace?: string | number[],
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+     static name: string,
+     static DNS: string,
+     static URL: string
+  }
+
+  declare module.exports: Class<v5>;
+}
diff --git a/flow-typed/Claim.js b/flow-typed/Claim.js
index e03eeae..0b97c0e 100644
--- a/flow-typed/Claim.js
+++ b/flow-typed/Claim.js
@@ -1,15 +1,11 @@
 // @flow
 
-declare type Claim = StreamClaim | ChannelClaim | CollectionClaim;
+declare type Claim = StreamClaim | ChannelClaim;
 
 declare type ChannelClaim = GenericClaim & {
   value: ChannelMetadata,
 };
 
-declare type CollectionClaim = GenericClaim & {
-  value: CollectionMetadata,
-};
-
 declare type StreamClaim = GenericClaim & {
   value: StreamMetadata,
 };
@@ -34,12 +30,9 @@ declare type GenericClaim = {
   short_url: string, // permanent_url with short id, no channel
   txid: string, // unique tx id
   type: 'claim' | 'update' | 'support',
-  value_type: 'stream' | 'channel' | 'collection',
+  value_type: 'stream' | 'channel',
   signing_channel?: ChannelClaim,
-  reposted_claim?: GenericClaim,
   repost_channel_url?: string,
-  repost_url?: string,
-  repost_bid_amount?: string,
   purchase_receipt?: PurchaseReceipt,
   meta: {
     activation_height: number,
@@ -78,10 +71,6 @@ declare type ChannelMetadata = GenericMetadata & {
   featured?: Array<string>,
 };
 
-declare type CollectionMetadata = GenericMetadata & {
-  claims: Array<string>,
-}
-
 declare type StreamMetadata = GenericMetadata & {
   license?: string, // License "title" ex: Creative Commons, Custom copyright
   license_url?: string, // Link to full license
@@ -144,71 +133,3 @@ declare type PurchaseReceipt = {
   txid: string,
   type: 'purchase',
 };
-
-declare type ClaimActionResolveInfo = {
-  [string]: {
-    stream: ?StreamClaim,
-    channel: ?ChannelClaim,
-    claimsInChannel: ?number,
-    collection: ?CollectionClaim,
-  },
-}
-
-declare type ChannelUpdateParams = {
-  claim_id: string,
-  bid?: string,
-  title?: string,
-  cover_url?: string,
-  thumbnail_url?: string,
-  description?: string,
-  website_url?: string,
-  email?: string,
-  tags?: Array<string>,
-  replace?: boolean,
-  languages?: Array<string>,
-  locations?: Array<string>,
-  blocking?: boolean,
-}
-
-declare type ChannelPublishParams = {
-  name: string,
-  bid: string,
-  blocking?: true,
-  title?: string,
-  cover_url?: string,
-  thumbnail_url?: string,
-  description?: string,
-  website_url?: string,
-  email?: string,
-  tags?: Array<string>,
-  languages?: Array<string>,
-}
-
-declare type CollectionUpdateParams = {
-  claim_id: string,
-  claim_ids?: Array<string>,
-  bid?: string,
-  title?: string,
-  cover_url?: string,
-  thumbnail_url?: string,
-  description?: string,
-  website_url?: string,
-  email?: string,
-  tags?: Array<string>,
-  replace?: boolean,
-  languages?: Array<string>,
-  locations?: Array<string>,
-  blocking?: boolean,
-}
-
-declare type CollectionPublishParams = {
-  name: string,
-  bid: string,
-  claim_ids: Array<string>,
-  blocking?: true,
-  title?: string,
-  thumbnail_url?: string,
-  description?: string,
-  tags?: Array<string>,
-  languages?: Array<string>,
-}
diff --git a/flow-typed/CoinSwap.js b/flow-typed/CoinSwap.js
deleted file mode 100644
index a41c571..0000000
--- a/flow-typed/CoinSwap.js
+++ /dev/null
@@ -1,29 +0,0 @@
-declare type CoinSwapInfo = {
-  chargeCode: string,
-  coins: Array<string>,
-  sendAddresses: { [string]: string},
-  sendAmounts: { [string]: any },
-  lbcAmount: number,
-  status?: {
-    status: string,
-    receiptCurrency: string,
-    receiptTxid: string,
-    lbcTxid: string,
-  },
-}
-
-declare type CoinSwapState = {
-  coinSwaps: Array<CoinSwapInfo>,
-};
-
-declare type CoinSwapAddAction = {
-  type: string,
-  data: CoinSwapInfo,
-};
-
-declare type CoinSwapRemoveAction = {
-  type: string,
-  data: {
-    chargeCode: string,
-  },
-};
diff --git a/flow-typed/Collections.js b/flow-typed/Collections.js
deleted file mode 100644
index f70825a..0000000
--- a/flow-typed/Collections.js
+++ /dev/null
@@ -1,34 +0,0 @@
-declare type Collection = {
-  id: string,
-  items: Array<?string>,
-  name: string,
-  type: string,
-  updatedAt: number,
-  totalItems?: number,
-  sourceId?: string, // if copied, claimId of original collection
-};
-
-declare type CollectionState = {
-  unpublished: CollectionGroup,
-  resolved: CollectionGroup,
-  pending: CollectionGroup,
-  edited: CollectionGroup,
-  builtin: CollectionGroup,
-  saved: Array<string>,
-  isResolvingCollectionById: { [string]: boolean },
-  error?: string | null,
-};
-
-declare type CollectionGroup = {
-  [string]: Collection,
-}
-
-declare type CollectionEditParams = {
-  claims?: Array<Claim>,
-  remove?: boolean,
-  claimIds?: Array<string>,
-  replace?: boolean,
-  order?: { from: number, to: number },
-  type?: string,
-  name?: string,
-}
diff --git a/flow-typed/Lbry.js b/flow-typed/Lbry.js
index 2fd2ac6..d7c0430 100644
--- a/flow-typed/Lbry.js
+++ b/flow-typed/Lbry.js
@@ -7,6 +7,10 @@ declare type StatusResponse = {
     download_progress: number,
     downloading_headers: boolean,
   },
+  connection_status: {
+    code: string,
+    message: string,
+  },
   dht: {
     node_id: string,
     peers_in_routing_table: number,
@@ -41,7 +45,6 @@ declare type StatusResponse = {
     redirects: {},
   },
   wallet: ?{
-    connected: string,
     best_blockhash: string,
     blocks: number,
     blocks_behind: number,
@@ -75,7 +78,7 @@ declare type BalanceResponse = {
 
 declare type ResolveResponse = {
   // Keys are the url(s) passed to resolve
-  [string]: { error?: {}, stream?: StreamClaim, channel?: ChannelClaim, collection?: CollectionClaim, claimsInChannel?: number },
+  [string]: { error?: {}, stream?: StreamClaim, channel?: ChannelClaim, claimsInChannel?: number },
 };
 
 declare type GetResponse = FileListItem & { error?: string };
@@ -124,22 +127,12 @@ declare type ChannelUpdateResponse = GenericTxResponse & {
 declare type CommentCreateResponse = Comment;
 declare type CommentUpdateResponse = Comment;
 
-declare type MyReactions = {
-  // Keys are the commentId
-  [string]: Array<string>,
-};
-
-declare type OthersReactions = {
-  // Keys are the commentId
-  [string]: {
-    // Keys are the reaction_type, e.g. 'like'
-    [string]: number,
-  },
-};
-
-declare type CommentReactListResponse = {
-  my_reactions: Array<MyReactions>,
-  others_reactions: Array<OthersReactions>,
+declare type CommentListResponse = {
+  items: Array<Comment>,
+  page: number,
+  page_size: number,
+  total_items: number,
+  total_pages: number,
 };
 
 declare type CommentHideResponse = {
@@ -147,11 +140,6 @@ declare type CommentHideResponse = {
   [string]: { hidden: boolean },
 };
 
-declare type CommentPinResponse = {
-  // keyed by the CommentIds entered
-  items: Comment,
-};
-
 declare type CommentAbandonResponse = {
   // keyed by the CommentId given
   abandoned: boolean,
@@ -165,42 +153,6 @@ declare type ChannelListResponse = {
   total_pages: number,
 };
 
-declare type ChannelSignResponse = {
-  signature: string,
-  signing_ts: string,
-};
-
-declare type CollectionCreateResponse = {
-  outputs: Array<Claim>,
-  page: number,
-  page_size: number,
-  total_items: number,
-  total_pages: number,
-}
-
-declare type CollectionListResponse = {
-  items: Array<Claim>,
-  page: number,
-  page_size: number,
-  total_items: number,
-  total_pages: number,
-};
-
-declare type CollectionResolveResponse = {
-  items: Array<Claim>,
-  total_items: number,
-};
-
-declare type CollectionResolveOptions = {
-  claim_id: string,
-};
-
-declare type CollectionListOptions = {
-  page: number,
-  page_size: number,
-  resolve?: boolean,
-};
-
 declare type FileListResponse = {
   items: Array<FileListItem>,
   page: number,
@@ -257,7 +209,7 @@ declare type StreamRepostOptions = {
   name: string,
   bid: string,
   claim_id: string,
-  channel_id?: string,
+  channel_id: string,
 };
 
 declare type StreamRepostResponse = GenericTxResponse;
@@ -310,7 +262,6 @@ declare type LbryTypes = {
   channel_update: (params: {}) => Promise<ChannelUpdateResponse>,
   channel_import: (params: {}) => Promise<string>,
   channel_list: (params: {}) => Promise<ChannelListResponse>,
-  channel_sign: (params: {}) => Promise<ChannelSignResponse>,
   stream_abandon: (params: {}) => Promise<GenericTxResponse>,
   stream_list: (params: {}) => Promise<StreamListResponse>,
   channel_abandon: (params: {}) => Promise<GenericTxResponse>,
@@ -319,10 +270,6 @@ declare type LbryTypes = {
   support_abandon: (params: {}) => Promise<SupportAbandonResponse>,
   stream_repost: (params: StreamRepostOptions) => Promise<StreamRepostResponse>,
   purchase_list: (params: PurchaseListOptions) => Promise<PurchaseListResponse>,
-  collection_resolve: (params: CollectionResolveOptions) => Promise<CollectionResolveResponse>,
-  collection_list: (params: CollectionListOptions) => Promise<CollectionListResponse>,
-  collection_create: (params: {}) => Promise<CollectionCreateResponse>,
-  collection_update: (params: {}) => Promise<CollectionCreateResponse>,
 
   // File fetching and manipulation
   file_list: (params: {}) => Promise<FileListResponse>,
@@ -335,6 +282,8 @@ declare type LbryTypes = {
   preference_set: (params: {}) => Promise<any>,
 
   // Commenting
+  comment_list: (params: {}) => Promise<CommentListResponse>,
+  comment_create: (params: {}) => Promise<CommentCreateResponse>,
   comment_update: (params: {}) => Promise<CommentUpdateResponse>,
   comment_hide: (params: {}) => Promise<CommentHideResponse>,
   comment_abandon: (params: {}) => Promise<CommentAbandonResponse>,
@@ -351,7 +300,6 @@ declare type LbryTypes = {
   address_unused: (params: {}) => Promise<string>, // New address
   address_list: (params: {}) => Promise<string>,
   transaction_list: (params: {}) => Promise<TxListResponse>,
-  txo_list: (params: {}) => Promise<any>,
 
   // Sync
   sync_hash: (params: {}) => Promise<string>,
diff --git a/flow-typed/Txo.js b/flow-typed/Txo.js
index c4ab9b6..5950c99 100644
--- a/flow-typed/Txo.js
+++ b/flow-typed/Txo.js
@@ -10,9 +10,6 @@ declare type Txo = {
   is_my_output: boolean,
   is_my_input: boolean,
   is_spent: boolean,
-  signing_channel?: {
-    channel_id: string,
-  },
 };
 
 declare type TxoListParams = {
@@ -24,4 +21,4 @@ declare type TxoListParams = {
   is_not_my_input?: boolean,
   is_not_my_output?: boolean,
   is_spent?: boolean,
-};
+}
diff --git a/flow-typed/npm/from-entries.js b/flow-typed/npm/from-entries.js
deleted file mode 100644
index ce92b81..0000000
--- a/flow-typed/npm/from-entries.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// @flow
-
-declare module '@ungap/from-entries' {
-  declare module.exports: any;
-}
diff --git a/flow-typed/npm/uuid.js b/flow-typed/npm/uuid.js
deleted file mode 100644
index 5760b38..0000000
--- a/flow-typed/npm/uuid.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// @flow
-
-declare module 'uuid' {
-  declare module.exports: any;
-}
diff --git a/flow-typed/npm/uuid_v3.x.x.js b/flow-typed/npm/uuid_v3.x.x.js
new file mode 100644
index 0000000..bf8d507
--- /dev/null
+++ b/flow-typed/npm/uuid_v3.x.x.js
@@ -0,0 +1,102 @@
+// flow-typed signature: 3cf668e64747095cab0bb360cf2fb34f
+// flow-typed version: d659bd0cb8/uuid_v3.x.x/flow_>=v0.32.x
+
+declare module "uuid" {
+  declare class uuid {
+    static (
+      options?: {|
+        random?: number[],
+        rng?: () => number[] | Buffer
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+    static v1(
+      options?: {|
+        node?: number[],
+        clockseq?: number,
+        msecs?: number | Date,
+        nsecs?: number
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+    static v4(
+      options?: {|
+        random?: number[],
+        rng?: () => number[] | Buffer
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string
+  }
+  declare module.exports: Class<uuid>;
+}
+
+declare module "uuid/v1" {
+  declare class v1 {
+    static (
+      options?: {|
+        node?: number[],
+        clockseq?: number,
+        msecs?: number | Date,
+        nsecs?: number
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string
+  }
+
+  declare module.exports: Class<v1>;
+}
+
+declare module "uuid/v3" {
+  declare class v3 {
+    static (
+      name?: string | number[],
+      namespace?: string | number[],
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+     static name: string,
+     static DNS: string,
+     static URL: string
+  }
+
+  declare module.exports: Class<v3>;
+}
+
+declare module "uuid/v4" {
+  declare class v4 {
+    static (
+      options?: {|
+        random?: number[],
+        rng?: () => number[] | Buffer
+      |},
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string
+  }
+
+  declare module.exports: Class<v4>;
+}
+
+declare module "uuid/v5" {
+  declare class v5 {
+    static (
+      name?: string | number[],
+      namespace?: string | number[],
+      buffer?: number[] | Buffer,
+      offset?: number
+    ): string,
+
+     static name: string,
+     static DNS: string,
+     static URL: string
+  }
+
+  declare module.exports: Class<v5>;
+}
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index a7b506d..0000000
--- a/jest.config.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = {
-  collectCoverageFrom: ["src/**/*.{js,jsx,mjs}"],
-  testMatch: ["<rootDir>/tests/**/*.test.js"],
-  transform: {
-    "^.+\\.(js|jsx|mjs)$": "<rootDir>/tests/config/jest-transformer.js",
-  },
-  transformIgnorePatterns: ["[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"]
-};
\ No newline at end of file
diff --git a/package.json b/package.json
index dc6bc25..b8214b4 100644
--- a/package.json
+++ b/package.json
@@ -25,21 +25,14 @@
     "dev": "rollup --config --watch",
     "precommit": "flow check && lint-staged",
     "lint": "eslint 'src/**/*.js' --fix",
-    "format": "prettier 'src/**/*.{js,json}' --write",
-    "test": "jest"
+    "format": "prettier 'src/**/*.{js,json}' --write"
   },
   "dependencies": {
-    "@ungap/from-entries": "^0.2.1",
     "proxy-polyfill": "0.1.6",
     "reselect": "^3.0.0",
-    "uuid": "^8.3.1"
+    "uuid": "^3.3.2"
   },
   "devDependencies": {
-    "@babel/plugin-proposal-class-properties": "^7.10.4",
-    "@babel/plugin-proposal-decorators": "^7.10.5",
-    "@babel/plugin-transform-flow-strip-types": "^7.10.4",
-    "@babel/preset-env": "^7.11.0",
-    "@babel/preset-react": "^7.10.4",
     "babel-core": "^6.26.0",
     "babel-eslint": "^8.0.3",
     "babel-loader": "^7.1.4",
@@ -60,7 +53,6 @@
     "flow-bin": "^0.97.0",
     "flow-typed": "^2.5.1",
     "husky": "^0.14.3",
-    "jest": "^26.4.2",
     "lint-staged": "^7.0.4",
     "prettier": "^1.4.2",
     "rollup": "^1.8.0",
diff --git a/src/constants/action_types.js b/src/constants/action_types.js
index bf16da2..74a718f 100644
--- a/src/constants/action_types.js
+++ b/src/constants/action_types.js
@@ -79,16 +79,6 @@ export const SET_TRANSACTION_LIST_FILTER = 'SET_TRANSACTION_LIST_FILTER';
 export const UPDATE_CURRENT_HEIGHT = 'UPDATE_CURRENT_HEIGHT';
 export const SET_DRAFT_TRANSACTION_AMOUNT = 'SET_DRAFT_TRANSACTION_AMOUNT';
 export const SET_DRAFT_TRANSACTION_ADDRESS = 'SET_DRAFT_TRANSACTION_ADDRESS';
-export const FETCH_UTXO_COUNT_STARTED = 'FETCH_UTXO_COUNT_STARTED';
-export const FETCH_UTXO_COUNT_COMPLETED = 'FETCH_UTXO_COUNT_COMPLETED';
-export const FETCH_UTXO_COUNT_FAILED = 'FETCH_UTXO_COUNT_FAILED';
-export const TIP_CLAIM_MASS_STARTED = 'TIP_CLAIM_MASS_STARTED';
-export const TIP_CLAIM_MASS_COMPLETED = 'TIP_CLAIM_MASS_COMPLETED';
-export const TIP_CLAIM_MASS_FAILED = 'TIP_CLAIM_MASS_FAILED';
-export const DO_UTXO_CONSOLIDATE_STARTED = 'DO_UTXO_CONSOLIDATE_STARTED';
-export const DO_UTXO_CONSOLIDATE_COMPLETED = 'DO_UTXO_CONSOLIDATE_COMPLETED';
-export const DO_UTXO_CONSOLIDATE_FAILED = 'DO_UTXO_CONSOLIDATE_FAILED';
-export const PENDING_CONSOLIDATED_TXOS_UPDATED = 'PENDING_CONSOLIDATED_TXOS_UPDATED';
 
 // Claims
 export const RESOLVE_URIS_STARTED = 'RESOLVE_URIS_STARTED';
@@ -102,9 +92,6 @@ export const ABANDON_CLAIM_SUCCEEDED = 'ABANDON_CLAIM_SUCCEEDED';
 export const FETCH_CHANNEL_LIST_STARTED = 'FETCH_CHANNEL_LIST_STARTED';
 export const FETCH_CHANNEL_LIST_COMPLETED = 'FETCH_CHANNEL_LIST_COMPLETED';
 export const FETCH_CHANNEL_LIST_FAILED = 'FETCH_CHANNEL_LIST_FAILED';
-export const FETCH_COLLECTION_LIST_STARTED = 'FETCH_COLLECTION_LIST_STARTED';
-export const FETCH_COLLECTION_LIST_COMPLETED = 'FETCH_COLLECTION_LIST_COMPLETED';
-export const FETCH_COLLECTION_LIST_FAILED = 'FETCH_COLLECTION_LIST_FAILED';
 export const CREATE_CHANNEL_STARTED = 'CREATE_CHANNEL_STARTED';
 export const CREATE_CHANNEL_COMPLETED = 'CREATE_CHANNEL_COMPLETED';
 export const CREATE_CHANNEL_FAILED = 'CREATE_CHANNEL_FAILED';
@@ -114,7 +101,6 @@ export const UPDATE_CHANNEL_FAILED = 'UPDATE_CHANNEL_FAILED';
 export const IMPORT_CHANNEL_STARTED = 'IMPORT_CHANNEL_STARTED';
 export const IMPORT_CHANNEL_COMPLETED = 'IMPORT_CHANNEL_COMPLETED';
 export const IMPORT_CHANNEL_FAILED = 'IMPORT_CHANNEL_FAILED';
-export const CLEAR_CHANNEL_ERRORS = 'CLEAR_CHANNEL_ERRORS';
 export const PUBLISH_STARTED = 'PUBLISH_STARTED';
 export const PUBLISH_COMPLETED = 'PUBLISH_COMPLETED';
 export const PUBLISH_FAILED = 'PUBLISH_FAILED';
@@ -133,6 +119,7 @@ export const CLAIM_REPOST_STARTED = 'CLAIM_REPOST_STARTED';
 export const CLAIM_REPOST_COMPLETED = 'CLAIM_REPOST_COMPLETED';
 export const CLAIM_REPOST_FAILED = 'CLAIM_REPOST_FAILED';
 export const CLEAR_REPOST_ERROR = 'CLEAR_REPOST_ERROR';
+export const CLEAR_CHANNEL_ERRORS = 'CLEAR_CHANNEL_ERRORS';
 export const CHECK_PUBLISH_NAME_STARTED = 'CHECK_PUBLISH_NAME_STARTED';
 export const CHECK_PUBLISH_NAME_COMPLETED = 'CHECK_PUBLISH_NAME_COMPLETED';
 export const UPDATE_PENDING_CLAIMS = 'UPDATE_PENDING_CLAIMS';
@@ -145,27 +132,6 @@ export const PURCHASE_LIST_STARTED = 'PURCHASE_LIST_STARTED';
 export const PURCHASE_LIST_COMPLETED = 'PURCHASE_LIST_COMPLETED';
 export const PURCHASE_LIST_FAILED = 'PURCHASE_LIST_FAILED';
 
-export const COLLECTION_PUBLISH_STARTED = 'COLLECTION_PUBLISH_STARTED';
-export const COLLECTION_PUBLISH_COMPLETED = 'COLLECTION_PUBLISH_COMPLETED';
-export const COLLECTION_PUBLISH_FAILED = 'COLLECTION_PUBLISH_FAILED';
-export const COLLECTION_PUBLISH_UPDATE_STARTED = 'COLLECTION_PUBLISH_UPDATE_STARTED';
-export const COLLECTION_PUBLISH_UPDATE_COMPLETED = 'COLLECTION_PUBLISH_UPDATE_COMPLETED';
-export const COLLECTION_PUBLISH_UPDATE_FAILED = 'COLLECTION_PUBLISH_UPDATE_FAILED';
-export const COLLECTION_PUBLISH_ABANDON_STARTED = 'COLLECTION_PUBLISH_ABANDON_STARTED';
-export const COLLECTION_PUBLISH_ABANDON_COMPLETED = 'COLLECTION_PUBLISH_ABANDON_COMPLETED';
-export const COLLECTION_PUBLISH_ABANDON_FAILED = 'COLLECTION_PUBLISH_ABANDON_FAILED';
-export const CLEAR_COLLECTION_ERRORS = 'CLEAR_COLLECTION_ERRORS';
-export const COLLECTION_ITEMS_RESOLVE_STARTED = 'COLLECTION_ITEMS_RESOLVE_STARTED';
-export const COLLECTION_ITEMS_RESOLVE_COMPLETED = 'COLLECTION_ITEMS_RESOLVE_COMPLETED';
-export const COLLECTION_ITEMS_RESOLVE_FAILED = 'COLLECTION_ITEMS_RESOLVE_FAILED';
-export const COLLECTION_NEW = 'COLLECTION_NEW';
-export const COLLECTION_DELETE = 'COLLECTION_DELETE';
-export const COLLECTION_PENDING = 'COLLECTION_PENDING';
-export const COLLECTION_EDIT = 'COLLECTION_EDIT';
-export const COLLECTION_COPY = 'COLLECTION_COPY';
-export const COLLECTION_SAVE = 'COLLECTION_SAVE';
-export const COLLECTION_ERROR = 'COLLECTION_ERROR';
-
 // Comments
 export const COMMENT_LIST_STARTED = 'COMMENT_LIST_STARTED';
 export const COMMENT_LIST_COMPLETED = 'COMMENT_LIST_COMPLETED';
@@ -300,6 +266,10 @@ export const FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED';
 export const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
 export const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
 
+// Tags
+export const TOGGLE_TAG_FOLLOW = 'TOGGLE_TAG_FOLLOW';
+export const TAG_ADD = 'TAG_ADD';
+export const TAG_DELETE = 'TAG_DELETE';
+
 // Sync
 export const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
-export const SYNC_FATAL_ERROR = 'SYNC_FATAL_ERROR';
diff --git a/src/constants/claim.js b/src/constants/claim.js
index 83ff7ed..4cf33ce 100644
--- a/src/constants/claim.js
+++ b/src/constants/claim.js
@@ -3,9 +3,3 @@ export const MINIMUM_PUBLISH_BID = 0.00000001;
 export const CHANNEL_ANONYMOUS = 'anonymous';
 export const CHANNEL_NEW = 'new';
 export const PAGE_SIZE = 20;
-
-export const LEVEL_1_STAKED_AMOUNT = 0;
-export const LEVEL_2_STAKED_AMOUNT = 1;
-export const LEVEL_3_STAKED_AMOUNT = 50;
-export const LEVEL_4_STAKED_AMOUNT = 250;
-export const LEVEL_5_STAKED_AMOUNT = 1000;
diff --git a/src/constants/collections.js b/src/constants/collections.js
deleted file mode 100644
index 0f2d111..0000000
--- a/src/constants/collections.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export const COLLECTION_ID = 'lid';
-export const COLLECTION_INDEX = 'linx';
-
-export const COL_TYPE_PLAYLIST = 'playlist';
-export const COL_TYPE_CHANNELS = 'channelList';
-
-export const WATCH_LATER_ID = 'watchlater';
-export const FAVORITES_ID = 'favorites';
-export const FAVORITE_CHANNELS_ID = 'favoriteChannels';
-export const BUILTIN_LISTS = [WATCH_LATER_ID, FAVORITES_ID, FAVORITE_CHANNELS_ID];
-
-export const COL_KEY_EDITED = 'edited';
-export const COL_KEY_UNPUBLISHED = 'unpublished';
-export const COL_KEY_PENDING = 'pending';
-export const COL_KEY_SAVED = 'saved';
diff --git a/src/constants/settings.js b/src/constants/settings.js
index cfcc15e..75df8e1 100644
--- a/src/constants/settings.js
+++ b/src/constants/settings.js
@@ -6,15 +6,9 @@ export const SHOW_NSFW = 'showNsfw';
 export const CREDIT_REQUIRED_ACKNOWLEDGED = 'credit_required_acknowledged';
 export const NEW_USER_ACKNOWLEDGED = 'welcome_acknowledged';
 export const EMAIL_COLLECTION_ACKNOWLEDGED = 'email_collection_acknowledged';
-export const FIRST_RUN_STARTED = 'first_run_started';
 export const INVITE_ACKNOWLEDGED = 'invite_acknowledged';
-export const FOLLOWING_ACKNOWLEDGED = 'following_acknowledged';
-export const TAGS_ACKNOWLEDGED = 'tags_acknowledged';
-export const REWARDS_ACKNOWLEDGED = 'rewards_acknowledged';
 export const LANGUAGE = 'language';
-export const SEARCH_IN_LANGUAGE = 'search_in_language';
 export const SHOW_MATURE = 'show_mature';
-export const HOMEPAGE = 'homepage';
 export const HIDE_REPOSTS = 'hide_reposts';
 export const SHOW_ANONYMOUS = 'show_anonymous';
 export const SHOW_UNAVAILABLE = 'show_unavailable';
@@ -23,24 +17,17 @@ export const INSTANT_PURCHASE_MAX = 'instant_purchase_max';
 export const THEME = 'theme';
 export const THEMES = 'themes';
 export const AUTOMATIC_DARK_MODE_ENABLED = 'automatic_dark_mode_enabled';
-export const AUTOPLAY_MEDIA = 'autoplay';
+export const AUTOPLAY = 'autoplay';
 export const AUTOPLAY_NEXT = 'autoplay_next';
 export const OS_NOTIFICATIONS_ENABLED = 'os_notifications_enabled';
 export const AUTO_DOWNLOAD = 'auto_download';
 export const AUTO_LAUNCH = 'auto_launch';
-export const TO_TRAY_WHEN_CLOSED = 'to_tray_when_closed';
 export const SUPPORT_OPTION = 'support_option';
 export const HIDE_BALANCE = 'hide_balance';
 export const HIDE_SPLASH_ANIMATION = 'hide_splash_animation';
 export const FLOATING_PLAYER = 'floating_player';
 export const DARK_MODE_TIMES = 'dark_mode_times';
 export const ENABLE_SYNC = 'enable_sync';
-export const ENABLE_PUBLISH_PREVIEW = 'enable-publish-preview';
-export const TILE_LAYOUT = 'tile_layout';
-export const VIDEO_THEATER_MODE = 'video_theater_mode';
-export const VIDEO_PLAYBACK_RATE = 'video_playback_rate';
-export const CUSTOM_COMMENTS_SERVER_ENABLED = 'custom_comments_server_enabled';
-export const CUSTOM_COMMENTS_SERVER_URL = 'custom_comments_server_url';
 
 // mobile settings
 export const BACKGROUND_PLAY_ENABLED = 'backgroundPlayEnabled';
diff --git a/src/constants/shared_preferences.js b/src/constants/shared_preferences.js
index 9778352..7257214 100644
--- a/src/constants/shared_preferences.js
+++ b/src/constants/shared_preferences.js
@@ -21,12 +21,14 @@ export const CLIENT_SYNC_KEYS = [
   SETTINGS.INSTANT_PURCHASE_ENABLED,
   SETTINGS.INSTANT_PURCHASE_MAX,
   SETTINGS.THEME,
-  SETTINGS.AUTOPLAY_MEDIA,
-  SETTINGS.AUTOPLAY_NEXT,
+  SETTINGS.AUTOPLAY,
   SETTINGS.HIDE_BALANCE,
   SETTINGS.HIDE_SPLASH_ANIMATION,
   SETTINGS.FLOATING_PLAYER,
   SETTINGS.DARK_MODE_TIMES,
   SETTINGS.AUTOMATIC_DARK_MODE_ENABLED,
-  SETTINGS.LANGUAGE,
 ];
+
+/*
+
+ */
diff --git a/src/constants/tags.js b/src/constants/tags.js
index 312b102..2af4f94 100644
--- a/src/constants/tags.js
+++ b/src/constants/tags.js
@@ -520,8 +520,6 @@ const DEFAULT_ENGLISH_KNOWN_TAGS = [
   '2020protests',
   'covidcuts',
   'covid-19',
-  'LBRYFoundationBoardCandidacy',
-  'helplbrysavecrypto'
 ];
 
 const DEFAULT_SPANISH_KNOWN_TAGS = [
diff --git a/src/index.js b/src/index.js
index 079665f..86fd871 100644
--- a/src/index.js
+++ b/src/index.js
@@ -12,7 +12,6 @@ import * as TXO_LIST from 'constants/txo_list';
 import * as SPEECH_URLS from 'constants/speech_urls';
 import * as DAEMON_SETTINGS from 'constants/daemon_settings';
 import * as SHARED_PREFERENCES from 'constants/shared_preferences';
-import * as COLLECTIONS_CONSTS from 'constants/collections';
 import { DEFAULT_KNOWN_TAGS, DEFAULT_FOLLOWED_TAGS, MATURE_TAGS } from 'constants/tags';
 import Lbry, { apiCall } from 'lbry';
 import LbryFirst from 'lbry-first';
@@ -36,7 +35,6 @@ export {
   MATURE_TAGS,
   SPEECH_URLS,
   SHARED_PREFERENCES,
-  COLLECTIONS_CONSTS,
 };
 
 // common
@@ -52,8 +50,6 @@ export {
   isURIClaimable,
   isNameValid,
   convertToShareLink,
-  splitBySeparator,
-  isURIEqual,
 } from 'lbryURI';
 
 // middlware
@@ -61,13 +57,6 @@ export { buildSharedStateMiddleware } from 'redux/middleware/shared-state';
 
 // actions
 export { doToast, doDismissToast, doError, doDismissError } from 'redux/actions/notifications';
-export {
-  doLocalCollectionCreate,
-  doFetchItemsInCollection,
-  doFetchItemsInCollections,
-  doCollectionEdit,
-  doCollectionDelete,
-} from 'redux/actions/collections';
 
 export {
   doFetchClaimsByChannel,
@@ -77,7 +66,6 @@ export {
   doResolveUris,
   doResolveUri,
   doFetchChannelListMine,
-  doFetchCollectionListMine,
   doCreateChannel,
   doUpdateChannel,
   doClaimSearch,
@@ -88,8 +76,6 @@ export {
   doCheckPublishNameAvailability,
   doPurchaseList,
   doCheckPendingClaims,
-  doCollectionPublish,
-  doCollectionPublishUpdate,
 } from 'redux/actions/claims';
 
 export { doClearPurchasedUriSuccess, doPurchaseUri, doFileGet } from 'redux/actions/file';
@@ -134,11 +120,10 @@ export {
   doUpdateBlockHeight,
   doClearSupport,
   doSupportAbandonForClaim,
-  doFetchUtxoCounts,
-  doUtxoConsolidate,
-  doTipClaimMass,
 } from 'redux/actions/wallet';
 
+export { doToggleTagFollow, doAddTag, doDeleteTag } from 'redux/actions/tags';
+
 export { doPopulateSharedUserState, doPreferenceGet, doPreferenceSet } from 'redux/actions/sync';
 
 // utils
@@ -153,40 +138,13 @@ export { contentReducer } from 'redux/reducers/content';
 export { fileInfoReducer } from 'redux/reducers/file_info';
 export { notificationsReducer } from 'redux/reducers/notifications';
 export { publishReducer } from 'redux/reducers/publish';
+export { tagsReducer } from 'redux/reducers/tags';
 export { walletReducer } from 'redux/reducers/wallet';
-export { collectionsReducer } from 'redux/reducers/collections';
 
 // selectors
 export { makeSelectContentPositionForUri } from 'redux/selectors/content';
 
 export { selectToast, selectError } from 'redux/selectors/notifications';
-export {
-  selectSavedCollectionIds,
-  selectBuiltinCollections,
-  selectResolvedCollections,
-  selectMyUnpublishedCollections,
-  selectMyEditedCollections,
-  selectMyPublishedCollections,
-  selectMyPublishedMixedCollections,
-  selectMyPublishedPlaylistCollections,
-  makeSelectEditedCollectionForId,
-  makeSelectPendingCollectionForId,
-  makeSelectPublishedCollectionForId,
-  makeSelectCollectionIsMine,
-  makeSelectMyPublishedCollectionForId,
-  makeSelectUnpublishedCollectionForId,
-  makeSelectCollectionForId,
-  makeSelectClaimUrlInCollection,
-  makeSelectUrlsForCollectionId,
-  makeSelectClaimIdsForCollectionId,
-  makeSelectNameForCollectionId,
-  makeSelectCountForCollectionId,
-  makeSelectIsResolvingCollectionForId,
-  makeSelectIndexForUrlInCollection,
-  makeSelectPreviousUrlForCollectionAndUrl,
-  makeSelectNextUrlForCollectionAndUrl,
-  makeSelectCollectionForIdHasClaimUrl,
-} from 'redux/selectors/collections';
 
 export {
   makeSelectClaimForUri,
@@ -202,24 +160,19 @@ export {
   makeSelectTitleForUri,
   makeSelectDateForUri,
   makeSelectAmountForUri,
-  makeSelectEffectiveAmountForUri,
   makeSelectTagsForUri,
-  makeSelectTagInClaimOrChannelForUri,
-  makeSelectTotalStakedAmountForChannelUri,
-  makeSelectStakedLevelForChannelUri,
   makeSelectContentTypeForUri,
   makeSelectIsUriResolving,
-  makeSelectPendingClaimForUri,
   makeSelectTotalItemsForChannel,
   makeSelectTotalPagesForChannel,
   makeSelectNsfwCountFromUris,
+  makeSelectNsfwCountForChannel,
   makeSelectOmittedCountForChannel,
   makeSelectClaimIsNsfw,
   makeSelectChannelForClaimUri,
-  makeSelectChannelPermUrlForClaimUri,
-  makeSelectMyChannelPermUrlForName,
   makeSelectClaimIsPending,
   makeSelectReflectingClaimForUri,
+  makeSelectClaimsInChannelForCurrentPageState,
   makeSelectShortUrlForUri,
   makeSelectCanonicalUrlForUri,
   makeSelectPermanentUrlForUri,
@@ -228,11 +181,7 @@ export {
   makeSelectClaimWasPurchased,
   makeSelectAbandoningClaimById,
   makeSelectIsAbandoningClaimForUri,
-  makeSelectClaimHasSource,
-  makeSelectClaimIsStreamPlaceholder,
-  selectPendingIds,
   selectReflectingById,
-  makeSelectClaimForClaimId,
   selectClaimsById,
   selectClaimsByUri,
   selectAllClaimsByChannel,
@@ -242,15 +191,12 @@ export {
   selectAllFetchingChannelClaims,
   selectIsFetchingClaimListMine,
   selectMyClaims,
-  selectPendingClaims,
   selectMyClaimsWithoutChannels,
   selectMyChannelUrls,
   selectMyClaimUrisWithoutChannels,
   selectAllMyClaimsByOutpoint,
   selectMyClaimsOutpoints,
   selectFetchingMyChannels,
-  selectFetchingMyCollections,
-  selectMyCollectionIds,
   selectMyChannelClaims,
   selectResolvingUris,
   selectPlayingUri,
@@ -279,12 +225,6 @@ export {
   selectFetchingMyPurchasesError,
   selectMyPurchasesCount,
   selectPurchaseUriSuccess,
-  makeSelectClaimIdForUri,
-  selectUpdatingCollection,
-  selectUpdateCollectionError,
-  selectCreatingCollection,
-  selectCreateCollectionError,
-  makeSelectClaimIdIsPending,
 } from 'redux/selectors/claims';
 
 export {
@@ -333,7 +273,6 @@ export {
   selectSupportsByOutpoint,
   selectTotalSupports,
   selectTransactionItems,
-  selectTransactionsFile,
   selectRecentTransactions,
   selectHasTransactions,
   selectIsFetchingTransactions,
@@ -371,11 +310,11 @@ export {
   selectPendingSupportTransactions,
   selectAbandonClaimSupportError,
   makeSelectPendingAmountByUri,
-  selectIsFetchingUtxoCounts,
-  selectIsConsolidatingUtxos,
-  selectIsMassClaimingTips,
-  selectUtxoCounts,
-  selectPendingOtherTransactions,
-  selectPendingConsolidateTxid,
-  selectPendingMassClaimTxid,
 } from 'redux/selectors/wallet';
+
+export {
+  selectFollowedTags,
+  selectFollowedTagsList,
+  selectUnfollowedTags,
+  makeSelectIsFollowingTag,
+} from 'redux/selectors/tags';
diff --git a/src/lbry.js b/src/lbry.js
index a7828d9..51f4111 100644
--- a/src/lbry.js
+++ b/src/lbry.js
@@ -86,14 +86,9 @@ const Lbry: LbryTypes = {
   stream_abandon: params => daemonCallWithResult('stream_abandon', params),
   stream_list: params => daemonCallWithResult('stream_list', params),
   channel_abandon: params => daemonCallWithResult('channel_abandon', params),
-  channel_sign: params => daemonCallWithResult('channel_sign', params),
   support_create: params => daemonCallWithResult('support_create', params),
   support_list: params => daemonCallWithResult('support_list', params),
   stream_repost: params => daemonCallWithResult('stream_repost', params),
-  collection_resolve: params => daemonCallWithResult('collection_resolve', params),
-  collection_list: params => daemonCallWithResult('collection_list', params),
-  collection_create: params => daemonCallWithResult('collection_create', params),
-  collection_update: params => daemonCallWithResult('collection_update', params),
 
   // File fetching and manipulation
   file_list: (params = {}) => daemonCallWithResult('file_list', params),
@@ -117,7 +112,6 @@ const Lbry: LbryTypes = {
   utxo_release: (params = {}) => daemonCallWithResult('utxo_release', params),
   support_abandon: (params = {}) => daemonCallWithResult('support_abandon', params),
   purchase_list: (params = {}) => daemonCallWithResult('purchase_list', params),
-  txo_list: (params = {}) => daemonCallWithResult('txo_list', params),
 
   sync_hash: (params = {}) => daemonCallWithResult('sync_hash', params),
   sync_apply: (params = {}) => daemonCallWithResult('sync_apply', params),
diff --git a/src/lbryURI.js b/src/lbryURI.js
index 02e13c4..9b871d7 100644
--- a/src/lbryURI.js
+++ b/src/lbryURI.js
@@ -4,7 +4,7 @@ const channelNameMinLength = 1;
 const claimIdMaxLength = 40;
 
 // see https://spec.lbry.com/#urls
-export const regexInvalidURI = /[ =&#:$@%?;/\\"<>%{}|^~[\]`\u{0000}-\u{0008}\u{000b}-\u{000c}\u{000e}-\u{001F}\u{D800}-\u{DFFF}\u{FFFE}-\u{FFFF}]/u;
+export const regexInvalidURI = /[ =&#:$@%?;/\\"<>%\{\}|^~[\]`\u{0000}-\u{0008}\u{000b}-\u{000c}\u{000e}-\u{001F}\u{D800}-\u{DFFF}\u{FFFE}-\u{FFFF}]/u;
 export const regexAddress = /^(b|r)(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/;
 const regexPartProtocol = '^((?:lbry://)?)';
 const regexPartStreamOrChannelName = '([^:$#/]*)';
@@ -12,11 +12,6 @@ const regexPartModifierSeparator = '([:$#]?)([^/]*)';
 const queryStringBreaker = '^([\\S]+)([?][\\S]*)';
 const separateQuerystring = new RegExp(queryStringBreaker);
 
-const MOD_SEQUENCE_SEPARATOR = '*';
-const MOD_CLAIM_ID_SEPARATOR_OLD = '#';
-const MOD_CLAIM_ID_SEPARATOR = ':';
-const MOD_BID_POSITION_SEPARATOR = '$';
-
 /**
  * Parses a LBRY name into its component parts. Throws errors with user-friendly
  * messages for invalid names.
@@ -34,7 +29,7 @@ const MOD_BID_POSITION_SEPARATOR = '$';
  *   - secondaryBidPosition (int, if present)
  */
 
-export function parseURI(url: string, requireProto: boolean = false): LbryUrlObj {
+export function parseURI(URL: string, requireProto: boolean = false): LbryUrlObj {
   // Break into components. Empty sub-matches are converted to null
 
   const componentsRegex = new RegExp(
@@ -47,12 +42,12 @@ export function parseURI(url: string, requireProto: boolean = false): LbryUrlObj
   );
   // chop off the querystring first
   let QSStrippedURL, qs;
-  const qsRegexResult = separateQuerystring.exec(url);
+  const qsRegexResult = separateQuerystring.exec(URL);
   if (qsRegexResult) {
     [QSStrippedURL, qs] = qsRegexResult.slice(1).map(match => match || null);
   }
 
-  const cleanURL = QSStrippedURL || url;
+  const cleanURL = QSStrippedURL || URL;
   const regexMatch = componentsRegex.exec(cleanURL) || [];
   const [proto, ...rest] = regexMatch.slice(1).map(match => match || null);
   const path = rest.join('');
@@ -80,7 +75,7 @@ export function parseURI(url: string, requireProto: boolean = false): LbryUrlObj
 
   rest.forEach(urlPiece => {
     if (urlPiece && urlPiece.includes(' ')) {
-      throw new Error(__('URL can not include a space'));
+      console.error('URL can not include a space');
     }
   });
 
@@ -149,11 +144,11 @@ function parseURIModifier(modSeperator: ?string, modValue: ?string) {
       throw new Error(__(`No modifier provided after separator %modSeperator%.`, { modSeperator }));
     }
 
-    if (modSeperator === MOD_CLAIM_ID_SEPARATOR || MOD_CLAIM_ID_SEPARATOR_OLD) {
+    if (modSeperator === '#') {
       claimId = modValue;
-    } else if (modSeperator === MOD_SEQUENCE_SEPARATOR) {
+    } else if (modSeperator === ':') {
       claimSequence = modValue;
-    } else if (modSeperator === MOD_BID_POSITION_SEPARATOR) {
+    } else if (modSeperator === '$') {
       bidPosition = modValue;
     }
   }
@@ -325,22 +320,3 @@ export function convertToShareLink(URL: string) {
     'https://open.lbry.com/'
   );
 }
-
-export function splitBySeparator(uri: string) {
-  const protocolLength = 7;
-  return uri.startsWith('lbry://') ? uri.slice(protocolLength).split(/[#:*]/) : uri.split(/#:\*\$/);
-}
-
-export function isURIEqual(uriA: string, uriB: string) {
-  const parseA = parseURI(normalizeURI(uriA));
-  const parseB = parseURI(normalizeURI(uriB));
-  if (parseA.isChannel) {
-    if (parseB.isChannel && parseA.channelClaimId === parseB.channelClaimId) {
-      return true;
-    }
-  } else if (parseA.streamClaimId === parseB.streamClaimId) {
-    return true;
-  } else {
-    return false;
-  }
-}
diff --git a/src/redux/actions/claims.js b/src/redux/actions/claims.js
index 9bb92af..d74cb32 100644
--- a/src/redux/actions/claims.js
+++ b/src/redux/actions/claims.js
@@ -10,33 +10,15 @@ import {
   selectClaimsByUri,
   selectMyChannelClaims,
   selectPendingIds,
-  selectPendingClaimsById,
 } from 'redux/selectors/claims';
-
 import { doFetchTxoPage } from 'redux/actions/wallet';
 import { selectSupportsByOutpoint } from 'redux/selectors/wallet';
 import { creditsToString } from 'util/format-credits';
 import { batchActions } from 'util/batch-actions';
 import { createNormalizedClaimSearchKey } from 'util/claim';
 import { PAGE_SIZE } from 'constants/claim';
-import {
-  selectPendingCollections,
-  makeSelectClaimIdsForCollectionId,
-} from 'redux/selectors/collections';
-import {
-  doFetchItemsInCollection,
-  doFetchItemsInCollections,
-  doCollectionDelete,
-} from 'redux/actions/collections';
 
-let onChannelConfirmCallback;
-let checkPendingInterval;
-
-export function doResolveUris(
-  uris: Array<string>,
-  returnCachedClaims: boolean = false,
-  resolveReposts: boolean = true
-) {
+export function doResolveUris(uris: Array<string>, returnCachedClaims: boolean = false) {
   return (dispatch: Dispatch, getState: GetState) => {
     const normalizedUris = uris.map(normalizeURI);
     const state = getState();
@@ -72,88 +54,50 @@ export function doResolveUris(
         stream: ?StreamClaim,
         channel: ?ChannelClaim,
         claimsInChannel: ?number,
-        collection: ?CollectionClaim,
       },
     } = {};
 
-    const collectionIds: Array<string> = [];
-
-    return Lbry.resolve({ urls: urisToResolve, ...options }).then(
-      async(result: ResolveResponse) => {
-        let repostedResults = {};
-        const repostsToResolve = [];
+    return Lbry.resolve({ urls: urisToResolve, ...options }).then((result: ResolveResponse) => {
+      Object.entries(result).forEach(([uri, uriResolveInfo]) => {
         const fallbackResolveInfo = {
           stream: null,
           claimsInChannel: null,
           channel: null,
         };
 
-        function processResult(result, resolveInfo = {}, checkReposts = false) {
-          Object.entries(result).forEach(([uri, uriResolveInfo]) => {
-            // Flow has terrible Object.entries support
-            // https://github.com/facebook/flow/issues/2221
-            if (uriResolveInfo) {
-              if (uriResolveInfo.error) {
-                // $FlowFixMe
-                resolveInfo[uri] = { ...fallbackResolveInfo };
-              } else {
-                if (checkReposts) {
-                  if (uriResolveInfo.reposted_claim) {
-                    // $FlowFixMe
-                    const repostUrl = uriResolveInfo.reposted_claim.permanent_url;
-                    if (!resolvingUris.includes(repostUrl)) {
-                      repostsToResolve.push(repostUrl);
-                    }
-                  }
-                }
-                let result = {};
-                if (uriResolveInfo.value_type === 'channel') {
-                  result.channel = uriResolveInfo;
-                  // $FlowFixMe
-                  result.claimsInChannel = uriResolveInfo.meta.claims_in_channel;
-                } else if (uriResolveInfo.value_type === 'collection') {
-                  result.collection = uriResolveInfo;
-                  // $FlowFixMe
-                  collectionIds.push(uriResolveInfo.claim_id);
-                } else {
-                  result.stream = uriResolveInfo;
-                  if (uriResolveInfo.signing_channel) {
-                    result.channel = uriResolveInfo.signing_channel;
-                    result.claimsInChannel =
-                      (uriResolveInfo.signing_channel.meta &&
-                        uriResolveInfo.signing_channel.meta.claims_in_channel) ||
-                      0;
-                  }
-                }
-                // $FlowFixMe
-                resolveInfo[uri] = result;
+        // Flow has terrible Object.entries support
+        // https://github.com/facebook/flow/issues/2221
+        if (uriResolveInfo) {
+          if (uriResolveInfo.error) {
+            resolveInfo[uri] = { ...fallbackResolveInfo };
+          } else {
+            let result = {};
+            if (uriResolveInfo.value_type === 'channel') {
+              result.channel = uriResolveInfo;
+              // $FlowFixMe
+              result.claimsInChannel = uriResolveInfo.meta.claims_in_channel;
+            } else {
+              result.stream = uriResolveInfo;
+              if (uriResolveInfo.signing_channel) {
+                result.channel = uriResolveInfo.signing_channel;
+                result.claimsInChannel =
+                  (uriResolveInfo.signing_channel.meta &&
+                    uriResolveInfo.signing_channel.meta.claims_in_channel) ||
+                  0;
               }
             }
-          });
+            // $FlowFixMe
+            resolveInfo[uri] = result;
+          }
         }
-        processResult(result, resolveInfo, resolveReposts);
+      });
 
-        if (repostsToResolve.length) {
-          dispatch({
-            type: ACTIONS.RESOLVE_URIS_STARTED,
-            data: { uris: repostsToResolve, debug: 'reposts' },
-          });
-          repostedResults = await Lbry.resolve({ urls: repostsToResolve, ...options });
-        }
-        processResult(repostedResults, resolveInfo);
-
-        dispatch({
-          type: ACTIONS.RESOLVE_URIS_COMPLETED,
-          data: { resolveInfo },
-        });
-
-        if (collectionIds.length) {
-          dispatch(doFetchItemsInCollections({ collectionIds: collectionIds, pageSize: 5 }));
-        }
-
-        return result;
-      }
-    );
+      dispatch({
+        type: ACTIONS.RESOLVE_URIS_COMPLETED,
+        data: { resolveInfo },
+      });
+      return result;
+    });
   };
 }
 
@@ -164,24 +108,18 @@ export function doResolveUri(uri: string) {
 export function doFetchClaimListMine(
   page: number = 1,
   pageSize: number = 99999,
-  resolve: boolean = true,
-  filterBy: Array<string> = []
+  resolve: boolean = true
 ) {
   return (dispatch: Dispatch) => {
     dispatch({
       type: ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED,
     });
 
-    let claimTypes = ['stream', 'repost'];
-    if (filterBy && filterBy.length !== 0) {
-      claimTypes = claimTypes.filter(t => filterBy.includes(t));
-    }
-
     // $FlowFixMe
     Lbry.claim_list({
       page: page,
       page_size: pageSize,
-      claim_type: claimTypes,
+      claim_type: ['stream', 'repost'],
       resolve,
     }).then((result: StreamListResponse) => {
       dispatch({
@@ -407,7 +345,7 @@ export function doClearChannelErrors() {
   };
 }
 
-export function doCreateChannel(name: string, amount: number, optionalParams: any, onConfirm: any) {
+export function doCreateChannel(name: string, amount: number, optionalParams: any, cb: any) {
   return (dispatch: Dispatch) => {
     dispatch({
       type: ACTIONS.CREATE_CHANNEL_STARTED,
@@ -423,8 +361,7 @@ export function doCreateChannel(name: string, amount: number, optionalParams: an
       description?: string,
       website_url?: string,
       email?: string,
-      tags?: Array<Tag>,
-      languages?: Array<string>,
+      tags?: Array<string>,
     } = {
       name,
       bid: creditsToString(amount),
@@ -453,9 +390,6 @@ export function doCreateChannel(name: string, amount: number, optionalParams: an
       if (optionalParams.tags) {
         createParams.tags = optionalParams.tags.map(tag => tag.name);
       }
-      if (optionalParams.languages) {
-        createParams.languages = optionalParams.languages;
-      }
     }
 
     return (
@@ -474,7 +408,7 @@ export function doCreateChannel(name: string, amount: number, optionalParams: an
               claims: [channelClaim],
             },
           });
-          dispatch(doCheckPendingClaims(onConfirm));
+          dispatch(doCheckPendingClaims(cb));
           return channelClaim;
         })
         .catch(error => {
@@ -507,7 +441,7 @@ export function doUpdateChannel(params: any, cb: any) {
       email: params.email,
       tags: [],
       replace: true,
-      languages: params.languages || [],
+      languages: [],
       locations: [],
       blocking: true,
     };
@@ -517,10 +451,15 @@ export function doUpdateChannel(params: any, cb: any) {
     }
 
     // we'll need to remove these once we add locations/channels to channel page edit/create options
+
     if (channelClaim && channelClaim.value && channelClaim.value.locations) {
       updateParams.locations = channelClaim.value.locations;
     }
 
+    if (channelClaim && channelClaim.value && channelClaim.value.languages) {
+      updateParams.languages = channelClaim.value.languages;
+    }
+
     return Lbry.channel_update(updateParams)
       .then((result: ChannelUpdateResponse) => {
         const channelClaim = result.outputs[0];
@@ -554,7 +493,7 @@ export function doImportChannel(certificate: string) {
     });
 
     return Lbry.channel_import({ channel_data: certificate })
-      .then(() => {
+      .then((result: string) => {
         dispatch({
           type: ACTIONS.IMPORT_CHANNEL_COMPLETED,
         });
@@ -596,54 +535,17 @@ export function doFetchChannelListMine(
   };
 }
 
-export function doFetchCollectionListMine(page: number = 1, pageSize: number = 99999) {
-  return (dispatch: Dispatch) => {
-    dispatch({
-      type: ACTIONS.FETCH_COLLECTION_LIST_STARTED,
-    });
-
-    const callback = (response: CollectionListResponse) => {
-      const { items } = response;
-      dispatch({
-        type: ACTIONS.FETCH_COLLECTION_LIST_COMPLETED,
-        data: { claims: items },
-      });
-      dispatch(
-        doFetchItemsInCollections({
-          collectionIds: items.map(claim => claim.claim_id),
-          page_size: 5,
-        })
-      );
-    };
-
-    const failure = error => {
-      dispatch({
-        type: ACTIONS.FETCH_COLLECTION_LIST_FAILED,
-        data: error,
-      });
-    };
-
-    Lbry.collection_list({ page, page_size: pageSize, resolve_claims: 1, resolve: true }).then(
-      callback,
-      failure
-    );
-  };
-}
-
 export function doClaimSearch(
   options: {
     page_size: number,
     page: number,
-    no_totals?: boolean,
+    no_totals: boolean,
     any_tags?: Array<string>,
-    claim_ids?: Array<string>,
     channel_ids?: Array<string>,
     not_channel_ids?: Array<string>,
     not_tags?: Array<string>,
     order_by?: Array<string>,
     release_time?: string,
-    has_source?: boolean,
-    has_no_souce?: boolean,
   } = {
     no_totals: true,
     page_size: 10,
@@ -651,7 +553,7 @@ export function doClaimSearch(
   }
 ) {
   const query = createNormalizedClaimSearchKey(options);
-  return async(dispatch: Dispatch) => {
+  return (dispatch: Dispatch) => {
     dispatch({
       type: ACTIONS.CLAIM_SEARCH_STARTED,
       data: { query: query },
@@ -675,7 +577,6 @@ export function doClaimSearch(
           pageSize: options.page_size,
         },
       });
-      return resolveInfo;
     };
 
     const failure = err => {
@@ -684,10 +585,9 @@ export function doClaimSearch(
         data: { query },
         error: err,
       });
-      return false;
     };
 
-    return await Lbry.claim_search({
+    Lbry.claim_search({
       ...options,
       include_purchase_receipt: true,
     }).then(success, failure);
@@ -695,7 +595,8 @@ export function doClaimSearch(
 }
 
 export function doRepost(options: StreamRepostOptions) {
-  return (dispatch: Dispatch): Promise<any> => {
+  return (dispatch: Dispatch) => {
+    // $FlowFixMe
     return new Promise(resolve => {
       dispatch({
         type: ACTIONS.CLAIM_REPOST_STARTED,
@@ -710,12 +611,6 @@ export function doRepost(options: StreamRepostOptions) {
             repostClaim,
           },
         });
-        dispatch({
-          type: ACTIONS.UPDATE_PENDING_CLAIMS,
-          data: {
-            claims: [repostClaim],
-          },
-        });
 
         dispatch(doFetchClaimListMine(1, 10));
         resolve(repostClaim);
@@ -735,209 +630,6 @@ export function doRepost(options: StreamRepostOptions) {
   };
 }
 
-export function doCollectionPublish(
-  options: {
-    name: string,
-    bid: string,
-    blocking: true,
-    title?: string,
-    channel_id?: string,
-    thumbnail_url?: string,
-    description?: string,
-    tags?: Array<Tag>,
-    languages?: Array<string>,
-    claims: Array<string>,
-  },
-  localId: string
-) {
-  return (dispatch: Dispatch): Promise<any> => {
-    // $FlowFixMe
-
-    const params: {
-      name: string,
-      bid: string,
-      channel_id?: string,
-      blocking?: true,
-      title?: string,
-      thumbnail_url?: string,
-      description?: string,
-      tags?: Array<string>,
-      languages?: Array<string>,
-      claims: Array<string>,
-    } = {
-      name: options.name,
-      bid: creditsToString(options.bid),
-      title: options.title,
-      thumbnail_url: options.thumbnail_url,
-      description: options.description,
-      tags: [],
-      languages: options.languages || [],
-      locations: [],
-      blocking: true,
-      claims: options.claims,
-    };
-
-    if (options.tags) {
-      params['tags'] = options.tags.map(tag => tag.name);
-    }
-
-    if (options.channel_id) {
-      params['channel_id'] = options.channel_id;
-    }
-
-    return new Promise(resolve => {
-      dispatch({
-        type: ACTIONS.COLLECTION_PUBLISH_STARTED,
-      });
-
-      function success(response) {
-        const collectionClaim = response.outputs[0];
-        dispatch(
-          batchActions(
-            {
-              type: ACTIONS.COLLECTION_PUBLISH_COMPLETED,
-              data: { claimId: collectionClaim.claim_id },
-            },
-            // move unpublished collection to pending collection with new publish id
-            // recent publish won't resolve this second. handle it in checkPending
-            {
-              type: ACTIONS.UPDATE_PENDING_CLAIMS,
-              data: {
-                claims: [collectionClaim],
-              },
-            }
-          )
-        );
-        dispatch({
-          type: ACTIONS.COLLECTION_PENDING,
-          data: { localId: localId, claimId: collectionClaim.claim_id },
-        });
-        dispatch(doCheckPendingClaims());
-        dispatch(doFetchCollectionListMine(1, 10));
-        return resolve(collectionClaim);
-      }
-
-      function failure(error) {
-        dispatch({
-          type: ACTIONS.COLLECTION_PUBLISH_FAILED,
-          data: {
-            error: error.message,
-          },
-        });
-      }
-
-      return Lbry.collection_create(params).then(success, failure);
-    });
-  };
-}
-
-export function doCollectionPublishUpdate(
-  options: {
-    bid?: string,
-    blocking?: true,
-    title?: string,
-    thumbnail_url?: string,
-    description?: string,
-    claim_id: string,
-    tags?: Array<Tag>,
-    languages?: Array<string>,
-    claims?: Array<string>,
-    channel_id?: string,
-  },
-  isBackgroundUpdate?: boolean
-) {
-  return (dispatch: Dispatch, getState: GetState): Promise<any> => {
-    // TODO: implement one click update
-
-    const updateParams: {
-      bid?: string,
-      blocking?: true,
-      title?: string,
-      thumbnail_url?: string,
-      channel_id?: string,
-      description?: string,
-      claim_id: string,
-      tags?: Array<string>,
-      languages?: Array<string>,
-      claims?: Array<string>,
-      clear_claims: boolean,
-      replace?: boolean,
-    } = isBackgroundUpdate
-      ? {
-        blocking: true,
-        claim_id: options.claim_id,
-        clear_claims: true,
-      }
-      : {
-        bid: creditsToString(options.bid),
-        title: options.title,
-        thumbnail_url: options.thumbnail_url,
-        description: options.description,
-        tags: [],
-        languages: options.languages || [],
-        locations: [],
-        blocking: true,
-        claim_id: options.claim_id,
-        clear_claims: true,
-        replace: true,
-      };
-
-    if (isBackgroundUpdate && updateParams.claim_id) {
-      const state = getState();
-      updateParams['claims'] = makeSelectClaimIdsForCollectionId(updateParams.claim_id)(state);
-    } else if (options.claims) {
-      updateParams['claims'] = options.claims;
-    }
-
-    if (options.tags) {
-      updateParams['tags'] = options.tags.map(tag => tag.name);
-    }
-
-    if (options.channel_id) {
-      updateParams['channel_id'] = options.channel_id;
-    }
-
-    return new Promise(resolve => {
-      dispatch({
-        type: ACTIONS.COLLECTION_PUBLISH_UPDATE_STARTED,
-      });
-
-      function success(response) {
-        const collectionClaim = response.outputs[0];
-        dispatch({
-          type: ACTIONS.COLLECTION_PUBLISH_UPDATE_COMPLETED,
-          data: {
-            collectionClaim,
-          },
-        });
-        dispatch({
-          type: ACTIONS.COLLECTION_PENDING,
-          data: { claimId: collectionClaim.claim_id },
-        });
-        dispatch({
-          type: ACTIONS.UPDATE_PENDING_CLAIMS,
-          data: {
-            claims: [collectionClaim],
-          },
-        });
-        dispatch(doCheckPendingClaims());
-        return resolve(collectionClaim);
-      }
-
-      function failure(error) {
-        dispatch({
-          type: ACTIONS.COLLECTION_PUBLISH_UPDATE_FAILED,
-          data: {
-            error: error.message,
-          },
-        });
-      }
-
-      return Lbry.collection_update(updateParams).then(success, failure);
-    });
-  };
-}
-
 export function doCheckPublishNameAvailability(name: string) {
   return (dispatch: Dispatch) => {
     dispatch({
@@ -1000,71 +692,47 @@ export function doPurchaseList(page: number = 1, pageSize: number = PAGE_SIZE) {
   };
 }
 
-export const doCheckPendingClaims = (onChannelConfirmed: Function) => (
+export const doCheckPendingClaims = (onConfirmed: Function) => (
   dispatch: Dispatch,
   getState: GetState
 ) => {
-  if (onChannelConfirmed) {
-    onChannelConfirmCallback = onChannelConfirmed;
-  }
-  clearInterval(checkPendingInterval);
-  const checkTxoList = () => {
+  let claimCheckInterval;
+
+  const checkClaimList = () => {
     const state = getState();
-    const pendingById = Object.assign({}, selectPendingClaimsById(state));
-    const pendingTxos = (Object.values(pendingById): any).map(p => p.txid);
-    // use collections
-    const pendingCollections = selectPendingCollections(state);
-    if (pendingTxos.length) {
-      Lbry.txo_list({ txid: pendingTxos })
-        .then(result => {
-          const txos = result.items;
-          const idsToConfirm = [];
-          txos.forEach(txo => {
-            if (txo.claim_id && txo.confirmations > 0) {
-              idsToConfirm.push(txo.claim_id);
-              delete pendingById[txo.claim_id];
+    const pendingIdSet = new Set(selectPendingIds(state));
+    Lbry.claim_list({ page: 1, page_size: 10 })
+      .then(result => {
+        const claims = result.items;
+        const claimsToConfirm = [];
+        claims.forEach(claim => {
+          const { claim_id: claimId } = claim;
+          if (claim.confirmations > 0 && pendingIdSet.has(claimId)) {
+            pendingIdSet.delete(claimId);
+            claimsToConfirm.push(claim);
+            if (onConfirmed) {
+              onConfirmed(claim);
             }
-          });
-          return { idsToConfirm, pendingById };
-        })
-        .then(results => {
-          const { idsToConfirm, pendingById } = results;
-          if (idsToConfirm.length) {
-            return Lbry.claim_list({ claim_id: idsToConfirm, resolve: true }).then(results => {
-              const claims = results.items;
-              const collectionIds = claims
-                .filter(c => c.value_type === 'collection')
-                .map(c => c.claim_id);
-              dispatch({
-                type: ACTIONS.UPDATE_CONFIRMED_CLAIMS,
-                data: {
-                  claims: claims,
-                  pending: pendingById,
-                },
-              });
-              if (collectionIds.length) {
-                dispatch(
-                  doFetchItemsInCollections({
-                    collectionIds,
-                  })
-                );
-              }
-              const channelClaims = claims.filter(claim => claim.value_type === 'channel');
-              if (channelClaims.length && onChannelConfirmCallback) {
-                channelClaims.forEach(claim => onChannelConfirmCallback(claim));
-              }
-              if (Object.keys(pendingById).length === 0) {
-                clearInterval(checkPendingInterval);
-              }
-            });
           }
         });
-    } else {
-      clearInterval(checkPendingInterval);
-    }
+        if (claimsToConfirm.length) {
+          dispatch({
+            type: ACTIONS.UPDATE_CONFIRMED_CLAIMS,
+            data: {
+              claims: claimsToConfirm,
+            },
+          });
+        }
+        return pendingIdSet.size;
+      })
+      .then(len => {
+        if (!len) {
+          clearInterval(claimCheckInterval);
+        }
+      });
   };
-  // do something with onConfirmed (typically get blocklist for channel)
-  checkPendingInterval = setInterval(() => {
-    checkTxoList();
+
+  claimCheckInterval = setInterval(() => {
+    checkClaimList();
   }, 30000);
 };
diff --git a/src/redux/actions/collections.js b/src/redux/actions/collections.js
deleted file mode 100644
index 1f310fe..0000000
--- a/src/redux/actions/collections.js
+++ /dev/null
@@ -1,495 +0,0 @@
-// @flow
-import * as ACTIONS from 'constants/action_types';
-import { v4 as uuid } from 'uuid';
-import Lbry from 'lbry';
-import { doClaimSearch, doAbandonClaim } from 'redux/actions/claims';
-import { makeSelectClaimForClaimId } from 'redux/selectors/claims';
-import {
-  makeSelectCollectionForId,
-  // makeSelectPublishedCollectionForId, // for "save" or "copy" action
-  makeSelectMyPublishedCollectionForId,
-  makeSelectPublishedCollectionForId,
-  makeSelectUnpublishedCollectionForId,
-  makeSelectEditedCollectionForId,
-} from 'redux/selectors/collections';
-import * as COLS from 'constants/collections';
-
-const getTimestamp = () => {
-  return Math.floor(Date.now() / 1000);
-};
-
-const FETCH_BATCH_SIZE = 50;
-
-export const doLocalCollectionCreate = (
-  name: string,
-  collectionItems: Array<string>,
-  type: string,
-  sourceId: string
-) => (dispatch: Dispatch) => {
-  return dispatch({
-    type: ACTIONS.COLLECTION_NEW,
-    data: {
-      entry: {
-        id: uuid(), // start with a uuid, this becomes a claimId after publish
-        name: name,
-        updatedAt: getTimestamp(),
-        items: collectionItems || [],
-        sourceId: sourceId,
-        type: type,
-      },
-    },
-  });
-};
-
-export const doCollectionDelete = (id: string, colKey: ?string = undefined) => (
-  dispatch: Dispatch,
-  getState: GetState
-) => {
-  const state = getState();
-  const claim = makeSelectClaimForClaimId(id)(state);
-  const collectionDelete = () =>
-    dispatch({
-      type: ACTIONS.COLLECTION_DELETE,
-      data: {
-        id: id,
-        collectionKey: colKey,
-      },
-    });
-  if (claim && !colKey) {
-    // could support "abandon, but keep" later
-    const { txid, nout } = claim;
-    return dispatch(doAbandonClaim(txid, nout, collectionDelete));
-  }
-  return collectionDelete();
-};
-
-// Given a collection, save its collectionId to be resolved and displayed in Library
-// export const doCollectionSave = (
-//   id: string,
-// ) => (dispatch: Dispatch) => {
-//   return dispatch({
-//     type: ACTIONS.COLLECTION_SAVE,
-//     data: {
-//       id: id,
-//     },
-//   });
-// };
-
-// Given a collection and name, copy it to a local private collection with a name
-// export const doCollectionCopy = (
-//   id: string,
-// ) => (dispatch: Dispatch) => {
-//   return dispatch({
-//     type: ACTIONS.COLLECTION_COPY,
-//     data: {
-//       id: id,
-//     },
-//   });
-// };
-
-export const doFetchItemsInCollections = (
-  resolveItemsOptions: {
-    collectionIds: Array<string>,
-    pageSize?: number,
-  },
-  resolveStartedCallback?: () => void
-) => async(dispatch: Dispatch, getState: GetState) => {
-  /*
-  1) make sure all the collection claims are loaded into claims reducer, search/resolve if necessary.
-  2) get the item claims for each
-  3) format and make sure they're in the order as in the claim
-  4) Build the collection objects and update collections reducer
-  5) Update redux claims reducer
-   */
-  let state = getState();
-  const { collectionIds, pageSize } = resolveItemsOptions;
-
-  dispatch({
-    type: ACTIONS.COLLECTION_ITEMS_RESOLVE_STARTED,
-    data: { ids: collectionIds },
-  });
-
-  if (resolveStartedCallback) resolveStartedCallback();
-
-  const collectionIdsToSearch = collectionIds.filter(claimId => !state.claims.byId[claimId]);
-
-  if (collectionIdsToSearch.length) {
-    await dispatch(doClaimSearch({ claim_ids: collectionIdsToSearch, page: 1, page_size: 9999 }));
-  }
-
-  const stateAfterClaimSearch = getState();
-
-  async function fetchItemsForCollectionClaim(claim: CollectionClaim, pageSize?: number) {
-    const totalItems = claim.value.claims && claim.value.claims.length;
-    const claimId = claim.claim_id;
-    const itemOrder = claim.value.claims;
-
-    const sortResults = (items: Array<Claim>, claimList) => {
-      const newItems: Array<Claim> = [];
-      claimList.forEach(id => {
-        const index = items.findIndex(i => i.claim_id === id);
-        if (index >= 0) {
-          newItems.push(items[index]);
-        }
-      });
-      /*
-        This will return newItems[] of length less than total_items below
-        if one or more of the claims has been abandoned. That's ok for now.
-      */
-      return newItems;
-    };
-
-    const mergeBatches = (
-      arrayOfResults: Array<{ items: Array<Claim>, total_items: number }>,
-      claimList: Array<string>
-    ) => {
-      const mergedResults: { items: Array<Claim>, total_items: number } = {
-        items: [],
-        total_items: 0,
-      };
-      arrayOfResults.forEach(result => {
-        mergedResults.items = mergedResults.items.concat(result.items);
-        mergedResults.total_items = result.total_items;
-      });
-
-      mergedResults.items = sortResults(mergedResults.items, claimList);
-      return mergedResults;
-    };
-
-    try {
-      const batchSize = pageSize || FETCH_BATCH_SIZE;
-      const batches: Array<Promise<any>> = [];
-
-      for (let i = 0; i < Math.ceil(totalItems / batchSize); i++) {
-        batches[i] = Lbry.claim_search({
-          claim_ids: claim.value.claims,
-          page: i + 1,
-          page_size: batchSize,
-          no_totals: true,
-        });
-      }
-      const itemsInBatches = await Promise.all(batches);
-      const result = mergeBatches(itemsInBatches, itemOrder);
-
-      // $FlowFixMe
-      const itemsById: { claimId: string, items?: ?Array<GenericClaim> } = { claimId: claimId };
-      if (result.items) {
-        itemsById.items = result.items;
-      } else {
-        itemsById.items = null;
-      }
-      return itemsById;
-    } catch (e) {
-      return {
-        claimId: claimId,
-        items: null,
-      };
-    }
-  }
-
-  function formatForClaimActions(resultClaimsByUri) {
-    const formattedClaims = {};
-    Object.entries(resultClaimsByUri).forEach(([uri, uriResolveInfo]) => {
-      // Flow has terrible Object.entries support
-      // https://github.com/facebook/flow/issues/2221
-      if (uriResolveInfo) {
-        let result = {};
-        if (uriResolveInfo.value_type === 'channel') {
-          result.channel = uriResolveInfo;
-          // $FlowFixMe
-          result.claimsInChannel = uriResolveInfo.meta.claims_in_channel;
-          // ALSO SKIP COLLECTIONS
-        } else if (uriResolveInfo.value_type === 'collection') {
-          result.collection = uriResolveInfo;
-        } else {
-          result.stream = uriResolveInfo;
-          if (uriResolveInfo.signing_channel) {
-            result.channel = uriResolveInfo.signing_channel;
-            result.claimsInChannel =
-              (uriResolveInfo.signing_channel.meta &&
-                uriResolveInfo.signing_channel.meta.claims_in_channel) ||
-              0;
-          }
-        }
-        // $FlowFixMe
-        formattedClaims[uri] = result;
-      }
-    });
-    return formattedClaims;
-  }
-
-  const invalidCollectionIds = [];
-  const promisedCollectionItemFetches = [];
-  collectionIds.forEach(collectionId => {
-    const claim = makeSelectClaimForClaimId(collectionId)(stateAfterClaimSearch);
-    if (!claim) {
-      invalidCollectionIds.push(collectionId);
-    } else {
-      promisedCollectionItemFetches.push(fetchItemsForCollectionClaim(claim, pageSize));
-    }
-  });
-
-  // $FlowFixMe
-  const collectionItemsById: Array<{
-    claimId: string,
-    items: ?Array<GenericClaim>,
-  }> = await Promise.all(promisedCollectionItemFetches);
-
-  const newCollectionObjectsById = {};
-  const resolvedItemsByUrl = {};
-  collectionItemsById.forEach(entry => {
-    // $FlowFixMe
-    const collectionItems: Array<any> = entry.items;
-    const collectionId = entry.claimId;
-    if (collectionItems) {
-      const claim = makeSelectClaimForClaimId(collectionId)(stateAfterClaimSearch);
-
-      const editedCollection = makeSelectEditedCollectionForId(collectionId)(stateAfterClaimSearch);
-      const { name, timestamp, value } = claim || {};
-      const { title } = value;
-      const valueTypes = new Set();
-      const streamTypes = new Set();
-
-      let newItems = [];
-      let isPlaylist;
-
-      if (collectionItems) {
-        collectionItems.forEach(collectionItem => {
-          newItems.push(collectionItem.permanent_url);
-          valueTypes.add(collectionItem.value_type);
-          if (collectionItem.value.stream_type) {
-            streamTypes.add(collectionItem.value.stream_type);
-          }
-          resolvedItemsByUrl[collectionItem.canonical_url] = collectionItem;
-        });
-        isPlaylist =
-          valueTypes.size === 1 &&
-          valueTypes.has('stream') &&
-          ((streamTypes.size === 1 && (streamTypes.has('audio') || streamTypes.has('video'))) ||
-            (streamTypes.size === 2 && (streamTypes.has('audio') && streamTypes.has('video'))));
-      }
-
-      newCollectionObjectsById[collectionId] = {
-        items: newItems,
-        id: collectionId,
-        name: title || name,
-        itemCount: claim.value.claims.length,
-        type: isPlaylist ? 'playlist' : 'collection',
-        updatedAt: timestamp,
-      };
-
-      if (editedCollection && timestamp > editedCollection['updatedAt']) {
-        dispatch({
-          type: ACTIONS.COLLECTION_DELETE,
-          data: {
-            id: collectionId,
-            collectionKey: 'edited',
-          },
-        });
-      }
-    } else {
-      invalidCollectionIds.push(collectionId);
-    }
-  });
-  const formattedClaimsByUri = formatForClaimActions(collectionItemsById);
-
-  dispatch({
-    type: ACTIONS.RESOLVE_URIS_COMPLETED,
-    data: { resolveInfo: formattedClaimsByUri },
-  });
-
-  dispatch({
-    type: ACTIONS.COLLECTION_ITEMS_RESOLVE_COMPLETED,
-    data: {
-      resolvedCollections: newCollectionObjectsById,
-      failedCollectionIds: invalidCollectionIds,
-    },
-  });
-};
-
-export const doFetchItemsInCollection = (
-  options: { collectionId: string, pageSize?: number },
-  cb?: () => void
-) => {
-  const { collectionId, pageSize } = options;
-  const newOptions: { collectionIds: Array<string>, pageSize?: number } = {
-    collectionIds: [collectionId],
-  };
-  if (pageSize) newOptions.pageSize = pageSize;
-  return doFetchItemsInCollections(newOptions, cb);
-};
-
-export const doCollectionEdit = (collectionId: string, params: CollectionEditParams) => async(
-  dispatch: Dispatch,
-  getState: GetState
-) => {
-  const state = getState();
-  const collection: Collection = makeSelectCollectionForId(collectionId)(state);
-  const editedCollection: Collection = makeSelectEditedCollectionForId(collectionId)(state);
-  const unpublishedCollection: Collection = makeSelectUnpublishedCollectionForId(collectionId)(
-    state
-  );
-  const publishedCollection: Collection = makeSelectPublishedCollectionForId(collectionId)(state); // needs to be published only
-
-  const generateCollectionItemsFromSearchResult = results => {
-    return (
-      Object.values(results)
-        // $FlowFixMe
-        .reduce(
-          (
-            acc,
-            cur: {
-              stream: ?StreamClaim,
-              channel: ?ChannelClaim,
-              claimsInChannel: ?number,
-              collection: ?CollectionClaim,
-            }
-          ) => {
-            let url;
-            if (cur.stream) {
-              url = cur.stream.permanent_url;
-            } else if (cur.channel) {
-              url = cur.channel.permanent_url;
-            } else if (cur.collection) {
-              url = cur.collection.permanent_url;
-            } else {
-              return acc;
-            }
-            acc.push(url);
-            return acc;
-          },
-          []
-        )
-    );
-  };
-
-  if (!collection) {
-    return dispatch({
-      type: ACTIONS.COLLECTION_ERROR,
-      data: {
-        message: 'collection does not exist',
-      },
-    });
-  }
-
-  let currentItems = collection.items ? collection.items.concat() : [];
-  const { claims: passedClaims, order, claimIds, replace, remove, type } = params;
-
-  const collectionType = type || collection.type;
-  let newItems: Array<?string> = currentItems;
-
-  if (passedClaims) {
-    if (remove) {
-      const passedUrls = passedClaims.map(claim => claim.permanent_url);
-      // $FlowFixMe // need this?
-      newItems = currentItems.filter((item: string) => !passedUrls.includes(item));
-    } else {
-      passedClaims.forEach(claim => newItems.push(claim.permanent_url));
-    }
-  }
-
-  if (claimIds) {
-    const batches = [];
-    if (claimIds.length > 50) {
-      for (let i = 0; i < Math.ceil(claimIds.length / 50); i++) {
-        batches[i] = claimIds.slice(i * 50, (i + 1) * 50);
-      }
-    } else {
-      batches[0] = claimIds;
-    }
-    const resultArray = await Promise.all(
-      batches.map(batch => {
-        let options = { claim_ids: batch, page: 1, page_size: 50 };
-        return dispatch(doClaimSearch(options));
-      })
-    );
-
-    const searchResults = Object.assign({}, ...resultArray);
-
-    if (replace) {
-      newItems = generateCollectionItemsFromSearchResult(searchResults);
-    } else {
-      newItems = currentItems.concat(generateCollectionItemsFromSearchResult(searchResults));
-    }
-  }
-
-  if (order) {
-    const [movedItem] = currentItems.splice(order.from, 1);
-    currentItems.splice(order.to, 0, movedItem);
-  }
-
-  // console.log('p&e', publishedCollection.items, newItems, publishedCollection.items.join(','), newItems.join(','))
-  if (editedCollection) {
-    // delete edited if newItems are the same as publishedItems
-    if (publishedCollection.items.join(',') === newItems.join(',')) {
-      dispatch({
-        type: ACTIONS.COLLECTION_DELETE,
-        data: {
-          id: collectionId,
-          collectionKey: 'edited',
-        },
-      });
-    } else {
-      dispatch({
-        type: ACTIONS.COLLECTION_EDIT,
-        data: {
-          id: collectionId,
-          collectionKey: 'edited',
-          collection: {
-            items: newItems,
-            id: collectionId,
-            name: params.name || collection.name,
-            updatedAt: getTimestamp(),
-            type: collectionType,
-          },
-        },
-      });
-    }
-  } else if (publishedCollection) {
-    dispatch({
-      type: ACTIONS.COLLECTION_EDIT,
-      data: {
-        id: collectionId,
-        collectionKey: 'edited',
-        collection: {
-          items: newItems,
-          id: collectionId,
-          name: params.name || collection.name,
-          updatedAt: getTimestamp(),
-          type: collectionType,
-        },
-      },
-    });
-  } else if (COLS.BUILTIN_LISTS.includes(collectionId)) {
-    dispatch({
-      type: ACTIONS.COLLECTION_EDIT,
-      data: {
-        id: collectionId,
-        collectionKey: 'builtin',
-        collection: {
-          items: newItems,
-          id: collectionId,
-          name: params.name || collection.name,
-          updatedAt: getTimestamp(),
-          type: collectionType,
-        },
-      },
-    });
-  } else if (unpublishedCollection) {
-    dispatch({
-      type: ACTIONS.COLLECTION_EDIT,
-      data: {
-        id: collectionId,
-        collectionKey: 'unpublished',
-        collection: {
-          items: newItems,
-          id: collectionId,
-          name: params.name || collection.name,
-          updatedAt: getTimestamp(),
-          type: collectionType,
-        },
-      },
-    });
-  }
-  return true;
-};
diff --git a/src/redux/actions/file.js b/src/redux/actions/file.js
index ad6ae70..b7dc699 100644
--- a/src/redux/actions/file.js
+++ b/src/redux/actions/file.js
@@ -104,10 +104,7 @@ export function doPurchaseUri(
         data: { uri, error: `Already fetching uri: ${uri}` },
       });
 
-      if (onSuccess) {
-        onSuccess(fileInfo);
-      }
-
+      Promise.resolve();
       return;
     }
 
diff --git a/src/redux/actions/notifications.js b/src/redux/actions/notifications.js
index faa76b5..78d0ac9 100644
--- a/src/redux/actions/notifications.js
+++ b/src/redux/actions/notifications.js
@@ -1,6 +1,6 @@
 // @flow
 import * as ACTIONS from 'constants/action_types';
-import { v4 as uuid } from 'uuid';
+import uuid from 'uuid/v4';
 
 export function doToast(params: ToastParams) {
   if (!params) {
diff --git a/src/redux/actions/publish.js b/src/redux/actions/publish.js
index 239a9bd..09b1e6a 100644
--- a/src/redux/actions/publish.js
+++ b/src/redux/actions/publish.js
@@ -21,7 +21,6 @@ export const doResetThumbnailStatus = () => (dispatch: Dispatch) => {
     type: ACTIONS.UPDATE_PUBLISH_FORM,
     data: {
       thumbnailPath: '',
-      thumbnailError: undefined,
     },
   });
 
@@ -69,8 +68,7 @@ export const doUploadThumbnail = (
   thumbnailBlob?: File,
   fsAdapter?: any,
   fs?: any,
-  path?: any,
-  cb?: (string) => void
+  path?: any
 ) => (dispatch: Dispatch) => {
   const downMessage = __('Thumbnail upload service may be down, try again later.');
   let thumbnail, fileExt, fileName, fileType;
@@ -98,13 +96,6 @@ export const doUploadThumbnail = (
     );
   };
 
-  dispatch({
-    type: ACTIONS.UPDATE_PUBLISH_FORM,
-    data: {
-      thumbnailError: undefined,
-    },
-  });
-
   const doUpload = data => {
     return fetch(SPEECH_PUBLISH, {
       method: 'POST',
@@ -113,17 +104,15 @@ export const doUploadThumbnail = (
       .then(res => res.text())
       .then(text => (text.length ? JSON.parse(text) : {}))
       .then(json => {
-        if (!json.success) return uploadError(json.message || downMessage);
-        if (cb) {
-          cb(json.data.serveUrl);
-        }
-        return dispatch({
-          type: ACTIONS.UPDATE_PUBLISH_FORM,
-          data: {
-            uploadThumbnailStatus: THUMBNAIL_STATUSES.COMPLETE,
-            thumbnail: json.data.serveUrl,
-          },
-        });
+        return json.success
+          ? dispatch({
+            type: ACTIONS.UPDATE_PUBLISH_FORM,
+            data: {
+              uploadThumbnailStatus: THUMBNAIL_STATUSES.COMPLETE,
+              thumbnail: json.data.serveUrl,
+            },
+          })
+          : uploadError(json.message || downMessage);
       })
       .catch(err => {
         let message = err.message;
@@ -195,7 +184,6 @@ export const doPrepareEdit = (claim: StreamClaim, uri: string, fileInfo: FileLis
       currency: 'LBC',
     },
     languages,
-    release_time,
     license,
     license_url: licenseUrl,
     thumbnail,
@@ -211,8 +199,6 @@ export const doPrepareEdit = (claim: StreamClaim, uri: string, fileInfo: FileLis
     description,
     fee,
     languages,
-    releaseTime: release_time,
-    releaseTimeEdited: undefined,
     thumbnail: thumbnail ? thumbnail.url : null,
     title,
     uri,
@@ -244,13 +230,11 @@ export const doPrepareEdit = (claim: StreamClaim, uri: string, fileInfo: FileLis
   dispatch({ type: ACTIONS.DO_PREPARE_EDIT, data: publishData });
 };
 
-export const doPublish = (success: Function, fail: Function, preview: Function) => (
+export const doPublish = (success: Function, fail: Function) => (
   dispatch: Dispatch,
   getState: () => {}
 ) => {
-  if (!preview) {
-    dispatch({ type: ACTIONS.PUBLISH_START });
-  }
+  dispatch({ type: ACTIONS.PUBLISH_START });
 
   const state = getState();
   const myClaimForUri = selectMyClaimForUri(state);
@@ -266,7 +250,6 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
     filePath,
     description,
     language,
-    releaseTimeEdited,
     license,
     licenseUrl,
     useLBRYUploader,
@@ -281,10 +264,7 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
     tags,
     locations,
     optimize,
-    isLivestreamPublish,
-    remoteFileUrl,
   } = publishData;
-
   // Handle scenario where we have a claim that has the same name as a channel we are publishing with.
   const myClaimForUriEditing = myClaimForUri && myClaimForUri.name === name ? myClaimForUri : null;
 
@@ -310,6 +290,7 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
     description?: string,
     channel_id?: string,
     file_path?: string,
+
     license_url?: string,
     license?: string,
     thumbnail_url?: string,
@@ -321,8 +302,6 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
     locations?: Array<any>,
     blocking: boolean,
     optimize_file?: boolean,
-    preview?: boolean,
-    remote_url?: string,
   } = {
     name,
     title,
@@ -333,14 +312,10 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
     tags: tags && tags.map(tag => tag.name),
     thumbnail_url: thumbnail,
     blocking: true,
-    preview: false,
   };
   // Temporary solution to keep the same publish flow with the new tags api
   // Eventually we will allow users to enter their own tags on publish
   // `nsfw` will probably be removed
-  if (remoteFileUrl) {
-    publishPayload.remote_url = remoteFileUrl;
-  }
 
   if (publishingLicense) {
     publishPayload.license = publishingLicense;
@@ -359,9 +334,7 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
   }
 
   // Set release time to curret date. On edits, keep original release/transaction time as release_time
-  if (releaseTimeEdited) {
-    publishPayload.release_time = releaseTimeEdited;
-  } else if (myClaimForUriEditing && myClaimForUriEditing.value.release_time) {
+  if (myClaimForUriEditing && myClaimForUriEditing.value.release_time) {
     publishPayload.release_time = Number(myClaimForUri.value.release_time);
   } else if (myClaimForUriEditing && myClaimForUriEditing.timestamp) {
     publishPayload.release_time = Number(myClaimForUriEditing.timestamp);
@@ -388,16 +361,7 @@ export const doPublish = (success: Function, fail: Function, preview: Function)
 
   // Only pass file on new uploads, not metadata only edits.
   // The sdk will figure it out
-  if (filePath && !isLivestreamPublish) publishPayload.file_path = filePath;
-
-  if (preview) {
-    publishPayload.preview = true;
-    publishPayload.optimize_file = false;
-
-    return Lbry.publish(publishPayload).then((previewResponse: PublishResponse) => {
-      return preview(previewResponse);
-    }, fail);
-  }
+  if (filePath) publishPayload.file_path = filePath;
 
   return Lbry.publish(publishPayload).then((response: PublishResponse) => {
     if (!useLBRYUploader) {
@@ -424,7 +388,7 @@ export const doCheckReflectingFiles = () => (dispatch: Dispatch, getState: GetSt
   const { checkingReflector } = state.claims;
   let reflectorCheckInterval;
 
-  const checkFileList = async () => {
+  const checkFileList = async() => {
     const state = getState();
     const reflectingById = selectReflectingById(state);
     const ids = Object.keys(reflectingById);
diff --git a/src/redux/actions/sync.js b/src/redux/actions/sync.js
index 3808004..2fc7a1e 100644
--- a/src/redux/actions/sync.js
+++ b/src/redux/actions/sync.js
@@ -6,17 +6,11 @@ type SharedData = {
   version: '0.1',
   value: {
     subscriptions?: Array<string>,
-    following?: Array<{ uri: string, notificationsDisabled: boolean }>,
     tags?: Array<string>,
     blocked?: Array<string>,
-    coin_swap_codes?: Array<string>,
     settings?: any,
     app_welcome_version?: number,
     sharing_3P?: boolean,
-    unpublishedCollections: CollectionGroup,
-    editedCollections: CollectionGroup,
-    builtinCollections: CollectionGroup,
-    savedCollections: Array<string>,
   },
 };
 
@@ -24,32 +18,20 @@ function extractUserState(rawObj: SharedData) {
   if (rawObj && rawObj.version === '0.1' && rawObj.value) {
     const {
       subscriptions,
-      following,
       tags,
       blocked,
-      coin_swap_codes,
       settings,
       app_welcome_version,
       sharing_3P,
-      unpublishedCollections,
-      editedCollections,
-      builtinCollections,
-      savedCollections,
     } = rawObj.value;
 
     return {
       ...(subscriptions ? { subscriptions } : {}),
-      ...(following ? { following } : {}),
       ...(tags ? { tags } : {}),
       ...(blocked ? { blocked } : {}),
-      ...(coin_swap_codes ? { coin_swap_codes } : {}),
       ...(settings ? { settings } : {}),
       ...(app_welcome_version ? { app_welcome_version } : {}),
       ...(sharing_3P ? { sharing_3P } : {}),
-      ...(unpublishedCollections ? { unpublishedCollections } : {}),
-      ...(editedCollections ? { editedCollections } : {}),
-      ...(builtinCollections ? { builtinCollections } : {}),
-      ...(savedCollections ? { savedCollections } : {}),
     };
   }
 
@@ -60,33 +42,21 @@ export function doPopulateSharedUserState(sharedSettings: any) {
   return (dispatch: Dispatch) => {
     const {
       subscriptions,
-      following,
       tags,
       blocked,
-      coin_swap_codes,
       settings,
       app_welcome_version,
       sharing_3P,
-      unpublishedCollections,
-      editedCollections,
-      builtinCollections,
-      savedCollections,
     } = extractUserState(sharedSettings);
     dispatch({
       type: ACTIONS.USER_STATE_POPULATE,
       data: {
         subscriptions,
-        following,
         tags,
         blocked,
-        coinSwapCodes: coin_swap_codes,
         settings,
         welcomeVersion: app_welcome_version,
         allowAnalytics: sharing_3P,
-        unpublishedCollections,
-        editedCollections,
-        builtinCollections,
-        savedCollections,
       },
     });
   };
@@ -99,61 +69,45 @@ export function doPreferenceSet(
   success: Function,
   fail: Function
 ) {
-  return (dispatch: Dispatch) => {
-    const preference = {
-      type: typeof value,
-      version,
-      value,
-    };
-
-    const options = {
-      key,
-      value: JSON.stringify(preference),
-    };
-
-    Lbry.preference_set(options)
-      .then(() => {
-        if (success) {
-          success(preference);
-        }
-      })
-      .catch(err => {
-        dispatch({
-          type: ACTIONS.SYNC_FATAL_ERROR,
-          error: err,
-        });
-
-        if (fail) {
-          fail();
-        }
-      });
+  const preference = {
+    type: typeof value,
+    version,
+    value,
   };
+
+  const options = {
+    key,
+    value: JSON.stringify(preference),
+  };
+
+  Lbry.preference_set(options)
+    .then(() => {
+      success(preference);
+    })
+    .catch(() => {
+      if (fail) {
+        fail();
+      }
+    });
 }
 
 export function doPreferenceGet(key: string, success: Function, fail?: Function) {
-  return (dispatch: Dispatch) => {
-    const options = {
-      key,
-    };
-
-    return Lbry.preference_get(options)
-      .then(result => {
-        if (result) {
-          const preference = result[key];
-          return success(preference);
-        }
-
-        return success(null);
-      })
-      .catch(err => {
-        dispatch({
-          type: ACTIONS.SYNC_FATAL_ERROR,
-          error: err,
-        });
-
-        if (fail) {
-          fail(err);
-        }
-      });
+  const options = {
+    key,
   };
+
+  Lbry.preference_get(options)
+    .then(result => {
+      if (result) {
+        const preference = result[key];
+        return success(preference);
+      }
+
+      return success(null);
+    })
+    .catch(err => {
+      if (fail) {
+        fail(err);
+      }
+    });
 }
diff --git a/src/redux/actions/tags.js b/src/redux/actions/tags.js
new file mode 100644
index 0000000..cd7568b
--- /dev/null
+++ b/src/redux/actions/tags.js
@@ -0,0 +1,24 @@
+// @flow
+import * as ACTIONS from 'constants/action_types';
+import Lbry from 'lbry';
+
+export const doToggleTagFollow = (name: string) => ({
+  type: ACTIONS.TOGGLE_TAG_FOLLOW,
+  data: {
+    name,
+  },
+});
+
+export const doAddTag = (name: string) => ({
+  type: ACTIONS.TAG_ADD,
+  data: {
+    name,
+  },
+});
+
+export const doDeleteTag = (name: string) => ({
+  type: ACTIONS.TAG_DELETE,
+  data: {
+    name,
+  },
+});
diff --git a/src/redux/actions/wallet.js b/src/redux/actions/wallet.js
index 9c06ea9..92c66f4 100644
--- a/src/redux/actions/wallet.js
+++ b/src/redux/actions/wallet.js
@@ -5,17 +5,13 @@ import {
   selectBalance,
   selectPendingSupportTransactions,
   selectTxoPageParams,
-  selectPendingOtherTransactions,
-  selectPendingConsolidateTxid,
-  selectPendingMassClaimTxid,
 } from 'redux/selectors/wallet';
 import { creditsToString } from 'util/format-credits';
-import { selectMyClaimsRaw, selectClaimsById } from 'redux/selectors/claims';
-import { doFetchChannelListMine, doFetchClaimListMine, doClaimSearch } from 'redux/actions/claims';
+import { selectMyClaimsRaw } from 'redux/selectors/claims';
+import { doFetchChannelListMine, doFetchClaimListMine } from 'redux/actions/claims';
 
 const FIFTEEN_SECONDS = 15000;
 let walletBalancePromise = null;
-
 export function doUpdateBalance() {
   return (dispatch, getState) => {
     const {
@@ -57,12 +53,13 @@ export function doUpdateBalance() {
 export function doBalanceSubscribe() {
   return dispatch => {
     dispatch(doUpdateBalance());
-    setInterval(() => dispatch(doUpdateBalance()), 10000);
+    setInterval(() => dispatch(doUpdateBalance()), 5000);
   };
 }
 
-export function doFetchTransactions(page = 1, pageSize = 999999) {
+export function doFetchTransactions(page = 1, pageSize = 99999) {
   return dispatch => {
+    dispatch(doFetchSupports());
     dispatch({
       type: ACTIONS.FETCH_TRANSACTIONS_STARTED,
     });
@@ -80,63 +77,24 @@ export function doFetchTransactions(page = 1, pageSize = 999999) {
 
 export function doFetchTxoPage() {
   return (dispatch, getState) => {
-    const fetchId = Math.random()
-      .toString(36)
-      .substr(2, 9);
-
     dispatch({
       type: ACTIONS.FETCH_TXO_PAGE_STARTED,
-      data: fetchId,
     });
 
     const state = getState();
     const queryParams = selectTxoPageParams(state);
 
     Lbry.txo_list(queryParams)
-      .then(res => {
-        const items = res.items || [];
-        const claimsById = selectClaimsById(state);
-
-        const channelIds = items.reduce((acc, cur) => {
-          if (
-            cur.type === 'support' &&
-            cur.signing_channel &&
-            !claimsById[cur.signing_channel.channel_id]
-          ) {
-            acc.push(cur.signing_channel.channel_id);
-          }
-          return acc;
-        }, []);
-
-        if (channelIds.length) {
-          const searchParams = {
-            page_size: 9999,
-            page: 1,
-            no_totals: true,
-            claim_ids: channelIds,
-          };
-          // make sure redux has these channels resolved
-          dispatch(doClaimSearch(searchParams));
-        }
-
-        return res;
-      })
       .then(res => {
         dispatch({
           type: ACTIONS.FETCH_TXO_PAGE_COMPLETED,
-          data: {
-            result: res,
-            fetchId: fetchId,
-          },
+          data: res,
         });
       })
       .catch(e => {
         dispatch({
           type: ACTIONS.FETCH_TXO_PAGE_COMPLETED,
-          data: {
-            error: e.message,
-            fetchId: fetchId,
-          },
+          data: e.message,
         });
       });
   };
@@ -170,74 +128,6 @@ export function doFetchSupports(page = 1, pageSize = 99999) {
   };
 }
 
-export function doFetchUtxoCounts() {
-  return async dispatch => {
-    dispatch({
-      type: ACTIONS.FETCH_UTXO_COUNT_STARTED,
-    });
-
-    let resultSets = await Promise.all([
-      Lbry.txo_list({ type: 'other', is_not_spent: true, page: 1, page_size: 1 }),
-      Lbry.txo_list({ type: 'support', is_not_spent: true, page: 1, page_size: 1 }),
-    ]);
-    const counts = {};
-    const paymentCount = resultSets[0]['total_items'];
-    const supportCount = resultSets[1]['total_items'];
-    counts['other'] = typeof paymentCount === 'number' ? paymentCount : 0;
-    counts['support'] = typeof supportCount === 'number' ? supportCount : 0;
-
-    dispatch({
-      type: ACTIONS.FETCH_UTXO_COUNT_COMPLETED,
-      data: counts,
-      debug: { resultSets },
-    });
-  };
-}
-
-export function doUtxoConsolidate() {
-  return async dispatch => {
-    dispatch({
-      type: ACTIONS.DO_UTXO_CONSOLIDATE_STARTED,
-    });
-
-    const results = await Lbry.txo_spend({ type: 'other' });
-    const result = results[0];
-
-    dispatch({
-      type: ACTIONS.PENDING_CONSOLIDATED_TXOS_UPDATED,
-      data: { txids: [result.txid] },
-    });
-
-    dispatch({
-      type: ACTIONS.DO_UTXO_CONSOLIDATE_COMPLETED,
-      data: { txid: result.txid },
-    });
-    dispatch(doCheckPendingTxs());
-  };
-}
-
-export function doTipClaimMass() {
-  return async dispatch => {
-    dispatch({
-      type: ACTIONS.TIP_CLAIM_MASS_STARTED,
-    });
-
-    const results = await Lbry.txo_spend({ type: 'support', is_not_my_input: true });
-    const result = results[0];
-
-    dispatch({
-      type: ACTIONS.PENDING_CONSOLIDATED_TXOS_UPDATED,
-      data: { txids: [result.txid] },
-    });
-
-    dispatch({
-      type: ACTIONS.TIP_CLAIM_MASS_COMPLETED,
-      data: { txid: result.txid },
-    });
-    dispatch(doCheckPendingTxs());
-  };
-}
-
 export function doGetNewAddress() {
   return dispatch => {
     dispatch({
@@ -295,7 +185,7 @@ export function doSendDraftTransaction(address, amount) {
         });
         dispatch(
           doToast({
-            message: __('You sent %amount% LBRY Credits', { amount: amount }),
+            message: __(`You sent ${amount} LBC`),
             linkText: __('History'),
             linkTarget: '/wallet',
           })
@@ -348,7 +238,7 @@ export function doSetDraftTransactionAddress(address) {
   };
 }
 
-export function doSendTip(params, isSupport, successCallback, errorCallback, shouldNotify = true) {
+export function doSendTip(params, isSupport, successCallback, errorCallback) {
   return (dispatch, getState) => {
     const state = getState();
     const balance = selectBalance(state);
@@ -367,25 +257,23 @@ export function doSendTip(params, isSupport, successCallback, errorCallback, sho
       return;
     }
 
-    const success = response => {
-      if (shouldNotify) {
-        dispatch(
-          doToast({
-            message: shouldSupport
-              ? __('You deposited %amount% LBRY Credits as a support!', { amount: params.amount })
-              : __('You sent %amount% LBRY Credits as a tip, Mahalo!', { amount: params.amount }),
-            linkText: __('History'),
-            linkTarget: '/wallet',
-          })
-        );
-      }
+    const success = () => {
+      dispatch(
+        doToast({
+          message: shouldSupport
+            ? __('You deposited %amount% LBC as a support!', { amount: params.amount })
+            : __('You sent %amount% LBC as a tip, Mahalo!', { amount: params.amount }),
+          linkText: __('History'),
+          linkTarget: '/wallet',
+        })
+      );
 
       dispatch({
         type: ACTIONS.SUPPORT_TRANSACTION_COMPLETED,
       });
 
       if (successCallback) {
-        successCallback(response);
+        successCallback();
       }
     };
 
@@ -494,7 +382,6 @@ export function doWalletLock() {
   };
 }
 
-// Collect all tips for a claim
 export function doSupportAbandonForClaim(claimId, claimType, keep, preview) {
   return dispatch => {
     if (preview) {
@@ -515,7 +402,7 @@ export function doSupportAbandonForClaim(claimId, claimType, keep, preview) {
         if (!preview) {
           dispatch({
             type: ACTIONS.ABANDON_CLAIM_SUPPORT_COMPLETED,
-            data: { claimId, txid: res.txid, effective: res.outputs[0].amount, type: claimType },
+            data: { claimId, txid: res.txid, effective: res.outputs[0].amount, type: claimType }, // add to pendingSupportTransactions,
           });
           dispatch(doCheckPendingTxs());
         }
@@ -558,7 +445,6 @@ export function doWalletReconnect() {
     });
   };
 }
-
 export function doWalletDecrypt() {
   return dispatch => {
     dispatch({
@@ -621,87 +507,53 @@ export function doUpdateBlockHeight() {
 export const doCheckPendingTxs = () => (dispatch, getState) => {
   const state = getState();
   const pendingTxsById = selectPendingSupportTransactions(state); // {}
-  const pendingOtherTxes = selectPendingOtherTransactions(state);
-
-  if (!Object.keys(pendingTxsById).length && !pendingOtherTxes.length) {
+  if (!Object.keys(pendingTxsById).length) {
     return;
   }
   let txCheckInterval;
   const checkTxList = () => {
     const state = getState();
-    const pendingSupportTxs = selectPendingSupportTransactions(state); // {}
-    const pendingConsolidateTxes = selectPendingOtherTransactions(state);
-    const pendingConsTxid = selectPendingConsolidateTxid(state);
-    const pendingMassCLaimTxid = selectPendingMassClaimTxid(state);
-
+    const pendingTxs = selectPendingSupportTransactions(state); // {}
     const promises = [];
     const newPendingTxes = {};
-    const noLongerPendingConsolidate = [];
     const types = new Set([]);
-    // { claimId: {txid: 123, amount 12.3}, }
-    const entries = Object.entries(pendingSupportTxs);
-    entries.forEach(([claim, data]) => {
+    let changed = false;
+    Object.entries(pendingTxs).forEach(([claim, data]) => {
       promises.push(Lbry.transaction_show({ txid: data.txid }));
       types.add(data.type);
     });
-    if (pendingConsolidateTxes.length) {
-      pendingConsolidateTxes.forEach(txid => promises.push(Lbry.transaction_show({ txid })));
-    }
 
-    Promise.all(promises).then(txShows => {
-      let changed = false;
-      txShows.forEach(result => {
-        if (pendingConsolidateTxes.includes(result.txid)) {
-          if (result.height > 0) {
-            noLongerPendingConsolidate.push(result.txid);
-          }
-        } else {
+    Promise.all(promises)
+      .then(txShows => {
+        txShows.forEach(result => {
           if (result.height <= 0) {
+            const entries = Object.entries(pendingTxs);
             const match = entries.find(entry => entry[1].txid === result.txid);
             newPendingTxes[match[0]] = match[1];
           } else {
             changed = true;
           }
+        });
+      })
+      .then(() => {
+        if (changed) {
+          dispatch({
+            type: ACTIONS.PENDING_SUPPORTS_UPDATED,
+            data: newPendingTxes,
+          });
+          if (types.has('channel')) {
+            dispatch(doFetchChannelListMine());
+          }
+          if (types.has('stream')) {
+            dispatch(doFetchClaimListMine());
+          }
         }
+        if (Object.keys(newPendingTxes).length === 0) clearInterval(txCheckInterval);
       });
 
-      if (changed) {
-        dispatch({
-          type: ACTIONS.PENDING_SUPPORTS_UPDATED,
-          data: newPendingTxes,
-        });
-        if (types.has('channel')) {
-          dispatch(doFetchChannelListMine());
-        }
-        if (types.has('stream')) {
-          dispatch(doFetchClaimListMine());
-        }
-      }
-      if (noLongerPendingConsolidate.length) {
-        if (noLongerPendingConsolidate.includes(pendingConsTxid)) {
-          dispatch(
-            doToast({
-              message: __('Your wallet is finished consolidating'),
-            })
-          );
-        }
-        if (noLongerPendingConsolidate.includes(pendingMassCLaimTxid)) {
-          dispatch(
-            doToast({
-              message: __('Your tips have been collected'),
-            })
-          );
-        }
-        dispatch({
-          type: ACTIONS.PENDING_CONSOLIDATED_TXOS_UPDATED,
-          data: { txids: noLongerPendingConsolidate, remove: true },
-        });
-      }
-
-      if (!Object.keys(pendingTxsById).length && !pendingOtherTxes.length) {
-        clearInterval(txCheckInterval);
-      }
-    });
+    if (!Object.keys(pendingTxsById).length) {
+      clearInterval(txCheckInterval);
+    }
   };
 
   txCheckInterval = setInterval(() => {
diff --git a/src/redux/middleware/shared-state.js b/src/redux/middleware/shared-state.js
index 031e9a4..100a86c 100644
--- a/src/redux/middleware/shared-state.js
+++ b/src/redux/middleware/shared-state.js
@@ -2,64 +2,53 @@
 import isEqual from 'util/deep-equal';
 import { doPreferenceSet } from 'redux/actions/sync';
 
-const RUN_PREFERENCES_DELAY_MS = 2000;
 const SHARED_PREFERENCE_VERSION = '0.1';
 let oldShared = {};
-let timeout;
+
 export const buildSharedStateMiddleware = (
   actions: Array<string>,
   sharedStateFilters: {},
   sharedStateCb?: any => void
-) => ({
-  getState,
-  dispatch,
-}: {
-  getState: () => { user: any, settings: any },
-  dispatch: any => void,
-}) => (next: ({}) => void) => (action: { type: string, data: any }) => {
+) => ({ getState, dispatch }: { getState: () => { user: any }, dispatch: any => void }) => (
+  next: ({}) => void
+) => (action: { type: string, data: any }) => {
   const currentState = getState();
 
   // We don't care if sync is disabled here, we always want to backup preferences to the wallet
   if (!actions.includes(action.type) || typeof action === 'function') {
     return next(action);
   }
-  clearTimeout(timeout);
+
   const actionResult = next(action);
   // Call `getState` after calling `next` to ensure the state has updated in response to the action
-  function runPreferences() {
-    const nextState: { user: any, settings: any } = getState();
-    const syncEnabled =
-      nextState.settings &&
-      nextState.settings.clientSettings &&
-      nextState.settings.clientSettings.enable_sync;
-    const hasVerifiedEmail =
-      nextState.user && nextState.user.user && nextState.user.user.has_verified_email;
-    const preferenceKey = syncEnabled && hasVerifiedEmail ? 'shared' : 'local';
-    const shared = {};
+  const nextState: { user: any } = getState();
+  const preferenceKey =
+    nextState.user && nextState.user.user && nextState.user.user.has_verified_email
+      ? 'shared'
+      : 'anon';
+  const shared = {};
 
-    Object.keys(sharedStateFilters).forEach(key => {
-      const filter = sharedStateFilters[key];
-      const { source, property, transform } = filter;
-      let value = nextState[source][property];
-      if (transform) {
-        value = transform(value);
-      }
-
-      shared[key] = value;
-    });
-
-    if (!isEqual(oldShared, shared)) {
-      // only update if the preference changed from last call in the same session
-      oldShared = shared;
-      dispatch(doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION));
+  Object.keys(sharedStateFilters).forEach(key => {
+    const filter = sharedStateFilters[key];
+    const { source, property, transform } = filter;
+    let value = nextState[source][property];
+    if (transform) {
+      value = transform(value);
     }
 
-    if (sharedStateCb) {
-      // Pass dispatch to the callback to consumers can dispatch actions in response to preference set
-      sharedStateCb({ dispatch, getState });
-    }
-    clearTimeout(timeout);
-    return actionResult;
+    shared[key] = value;
+  });
+
+  if (!isEqual(oldShared, shared)) {
+    // only update if the preference changed from last call in the same session
+    oldShared = shared;
+    doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION);
   }
-  timeout = setTimeout(runPreferences, RUN_PREFERENCES_DELAY_MS);
+
+  if (sharedStateCb) {
+    // Pass dispatch to the callback to consumers can dispatch actions in response to preference set
+    sharedStateCb({ dispatch, getState });
+  }
+
+  return actionResult;
 };
diff --git a/src/redux/reducers/claims.js b/src/redux/reducers/claims.js
index 410e032..ecfa9d8 100644
--- a/src/redux/reducers/claims.js
+++ b/src/redux/reducers/claims.js
@@ -13,20 +13,17 @@ import mergeClaim from 'util/merge-claim';
 
 type State = {
   createChannelError: ?string,
-  createCollectionError: ?string,
   channelClaimCounts: { [string]: number },
   claimsByUri: { [string]: string },
   byId: { [string]: Claim },
-  pendingById: { [string]: Claim }, // keep pending claims
   resolvingUris: Array<string>,
+  pendingIds: Array<string>,
   reflectingById: { [string]: ReflectingUpdate },
   myClaims: ?Array<string>,
   myChannelClaims: ?Array<string>,
-  myCollectionClaims: ?Array<string>,
   abandoningById: { [string]: boolean },
   fetchingChannelClaims: { [string]: number },
   fetchingMyChannels: boolean,
-  fetchingMyCollections: boolean,
   fetchingClaimSearchByQuery: { [string]: boolean },
   purchaseUriSuccess: boolean,
   myPurchases: ?Array<string>,
@@ -37,7 +34,6 @@ type State = {
   claimSearchByQuery: { [string]: Array<string> },
   claimSearchByQueryLastPageReached: { [string]: Array<boolean> },
   creatingChannel: boolean,
-  creatingCollection: boolean,
   paginatedClaimsByChannel: {
     [string]: {
       all: Array<string>,
@@ -47,9 +43,7 @@ type State = {
     },
   },
   updateChannelError: ?string,
-  updateCollectionError: ?string,
   updatingChannel: boolean,
-  updatingCollection: boolean,
   pendingChannelImport: string | boolean,
   repostLoading: boolean,
   repostError: ?string,
@@ -72,7 +66,6 @@ const defaultState = {
   fetchingChannelClaims: {},
   resolvingUris: [],
   myChannelClaims: undefined,
-  myCollectionClaims: [],
   myClaims: undefined,
   myPurchases: undefined,
   myPurchasesPageNumber: undefined,
@@ -81,22 +74,17 @@ const defaultState = {
   fetchingMyPurchases: false,
   fetchingMyPurchasesError: undefined,
   fetchingMyChannels: false,
-  fetchingMyCollections: false,
   abandoningById: {},
-  pendingById: {},
+  pendingIds: [],
   reflectingById: {},
   claimSearchError: false,
   claimSearchByQuery: {},
   claimSearchByQueryLastPageReached: {},
   fetchingClaimSearchByQuery: {},
   updateChannelError: '',
-  updateCollectionError: '',
   updatingChannel: false,
   creatingChannel: false,
   createChannelError: undefined,
-  updatingCollection: false,
-  creatingCollection: false,
-  createCollectionError: undefined,
   pendingChannelImport: false,
   repostLoading: false,
   repostError: undefined,
@@ -112,22 +100,29 @@ const defaultState = {
 };
 
 function handleClaimAction(state: State, action: any): State {
-  const { resolveInfo }: ClaimActionResolveInfo = action.data;
+  const {
+    resolveInfo,
+  }: {
+    [string]: {
+      stream: ?StreamClaim,
+      channel: ?ChannelClaim,
+      claimsInChannel: ?number,
+    },
+  } = action.data;
 
   const byUri = Object.assign({}, state.claimsByUri);
   const byId = Object.assign({}, state.byId);
   const channelClaimCounts = Object.assign({}, state.channelClaimCounts);
-  const pendingById = state.pendingById;
+  const pendingIds = state.pendingIds;
   let newResolvingUrls = new Set(state.resolvingUris);
   let myClaimIds = new Set(state.myClaims);
 
   Object.entries(resolveInfo).forEach(([url: string, resolveResponse: ResolveResponse]) => {
     // $FlowFixMe
-    const { claimsInChannel, stream, channel: channelFromResolve, collection } = resolveResponse;
-    const channel = channelFromResolve || (stream && stream.signing_channel);
+    const { claimsInChannel, stream, channel } = resolveResponse;
 
     if (stream) {
-      if (pendingById[stream.claim_id]) {
+      if (pendingIds.includes(stream.claim_id)) {
         byId[stream.claim_id] = mergeClaim(stream, byId[stream.claim_id]);
       } else {
         byId[stream.claim_id] = stream;
@@ -157,37 +152,20 @@ function handleClaimAction(state: State, action: any): State {
         channelClaimCounts[channel.canonical_url] = claimsInChannel;
       }
 
-      if (pendingById[channel.claim_id]) {
+      if (pendingIds.includes(channel.claim_id)) {
         byId[channel.claim_id] = mergeClaim(channel, byId[channel.claim_id]);
       } else {
         byId[channel.claim_id] = channel;
       }
-
+      // Also add the permanent_url here until lighthouse returns canonical_url for search results
       byUri[channel.permanent_url] = channel.claim_id;
       byUri[channel.canonical_url] = channel.claim_id;
       newResolvingUrls.delete(channel.canonical_url);
       newResolvingUrls.delete(channel.permanent_url);
     }
 
-    if (collection) {
-      if (pendingById[collection.claim_id]) {
-        byId[collection.claim_id] = mergeClaim(collection, byId[collection.claim_id]);
-      } else {
-        byId[collection.claim_id] = collection;
-      }
-      byUri[url] = collection.claim_id;
-      byUri[collection.canonical_url] = collection.claim_id;
-      byUri[collection.permanent_url] = collection.claim_id;
-      newResolvingUrls.delete(collection.canonical_url);
-      newResolvingUrls.delete(collection.permanent_url);
-
-      if (collection.is_my_output) {
-        myClaimIds.add(collection.claim_id);
-      }
-    }
-
     newResolvingUrls.delete(url);
-    if (!stream && !channel && !collection && !pendingById[byUri[url]]) {
+    if (!stream && !channel && !pendingIds.includes(byUri[url])) {
       byUri[url] = null;
     }
   });
@@ -230,33 +208,34 @@ reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_STARTED] = (state: State): State =>
   });
 
 reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = (state: State, action: any): State => {
-  const { result }: { result: ClaimListResponse } = action.data;
+  const { result, resolve }: { result: ClaimListResponse, resolve: boolean } = action.data;
   const claims = result.items;
   const page = result.page;
   const totalItems = result.total_items;
 
   const byId = Object.assign({}, state.byId);
   const byUri = Object.assign({}, state.claimsByUri);
-  const pendingById = Object.assign({}, state.pendingById);
+  const pendingIds = state.pendingIds || [];
   let myClaimIds = new Set(state.myClaims);
   let urlsForCurrentPage = [];
 
+  const pendingIdSet = new Set(pendingIds);
+
   claims.forEach((claim: Claim) => {
-    const { permanent_url: permanentUri, claim_id: claimId, canonical_url: canonicalUri } = claim;
+    const { permanent_url: permanentUri, claim_id: claimId } = claim;
     if (claim.type && claim.type.match(/claim|update/)) {
       urlsForCurrentPage.push(permanentUri);
       if (claim.confirmations < 1) {
-        pendingById[claimId] = claim;
-        if (byId[claimId]) {
-          byId[claimId] = mergeClaim(claim, byId[claimId]);
-        } else {
-          byId[claimId] = claim;
-        }
+        pendingIdSet.add(claimId);
+      } else if (!resolve && pendingIdSet.has(claimId) && claim.confirmations > 0) {
+        pendingIdSet.delete(claimId);
+      }
+      if (pendingIds.includes(claimId)) {
+        byId[claimId] = mergeClaim(claim, byId[claimId]);
       } else {
         byId[claimId] = claim;
       }
       byUri[permanentUri] = claimId;
-      byUri[canonicalUri] = claimId;
       myClaimIds.add(claimId);
     }
   });
@@ -265,7 +244,7 @@ reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = (state: State, action: any):
     isFetchingClaimListMine: false,
     myClaims: Array.from(myClaimIds),
     byId,
-    pendingById,
+    pendingIds: Array.from(pendingIdSet),
     claimsByUri: byUri,
     myClaimsPageResults: urlsForCurrentPage,
     myClaimsPageNumber: page,
@@ -278,8 +257,9 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_STARTED] = (state: State): State =>
 
 reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): State => {
   const { claims }: { claims: Array<ChannelClaim> } = action.data;
+  const myClaims = state.myClaims || [];
   let myClaimIds = new Set(state.myClaims);
-  const pendingById = Object.assign({}, state.pendingById);
+  const pendingIds = state.pendingIds || [];
   let myChannelClaims;
   const byId = Object.assign({}, state.byId);
   const byUri = Object.assign({}, state.claimsByUri);
@@ -293,12 +273,7 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): St
     claims.forEach(claim => {
       const { meta } = claim;
       const { claims_in_channel: claimsInChannel } = claim.meta;
-      const {
-        canonical_url: canonicalUrl,
-        permanent_url: permanentUrl,
-        claim_id: claimId,
-        confirmations,
-      } = claim;
+      const { canonical_url: canonicalUrl, permanent_url: permanentUrl, claim_id: claimId } = claim;
 
       byUri[canonicalUrl] = claimId;
       byUri[permanentUrl] = claimId;
@@ -307,14 +282,7 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): St
 
       // $FlowFixMe
       myChannelClaims.add(claimId);
-      if (confirmations < 1) {
-        pendingById[claimId] = claim;
-        if (byId[claimId]) {
-          byId[claimId] = mergeClaim(claim, byId[claimId]);
-        } else {
-          byId[claimId] = claim;
-        }
-      } else {
+      if (!pendingIds.some(c => c === claimId)) {
         byId[claimId] = claim;
       }
       myClaimIds.add(claimId);
@@ -323,7 +291,6 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): St
 
   return Object.assign({}, state, {
     byId,
-    pendingById,
     claimsByUri: byUri,
     channelClaimCounts,
     fetchingMyChannels: false,
@@ -338,66 +305,6 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_FAILED] = (state: State, action: any): State
   });
 };
 
-reducers[ACTIONS.FETCH_COLLECTION_LIST_STARTED] = (state: State): State => ({
-  ...state,
-  fetchingMyCollections: true,
-});
-
-reducers[ACTIONS.FETCH_COLLECTION_LIST_COMPLETED] = (state: State, action: any): State => {
-  const { claims }: { claims: Array<CollectionClaim> } = action.data;
-  const myClaims = state.myClaims || [];
-  let myClaimIds = new Set(myClaims);
-  const pendingById = Object.assign({}, state.pendingById);
-  let myCollectionClaimsSet = new Set([]);
-  const byId = Object.assign({}, state.byId);
-  const byUri = Object.assign({}, state.claimsByUri);
-
-  if (claims.length) {
-    myCollectionClaimsSet = new Set(state.myCollectionClaims);
-    claims.forEach(claim => {
-      const { meta } = claim;
-      const {
-        canonical_url: canonicalUrl,
-        permanent_url: permanentUrl,
-        claim_id: claimId,
-        confirmations,
-      } = claim;
-
-      byUri[canonicalUrl] = claimId;
-      byUri[permanentUrl] = claimId;
-
-      // $FlowFixMe
-      myCollectionClaimsSet.add(claimId);
-      // we don't want to overwrite a pending result with a resolve
-      if (confirmations < 1) {
-        pendingById[claimId] = claim;
-        if (byId[claimId]) {
-          byId[claimId] = mergeClaim(claim, byId[claimId]);
-        } else {
-          byId[claimId] = claim;
-        }
-      } else {
-        byId[claimId] = claim;
-      }
-      myClaimIds.add(claimId);
-    });
-  }
-
-  return {
-    ...state,
-    byId,
-    pendingById,
-    claimsByUri: byUri,
-    fetchingMyCollections: false,
-    myCollectionClaims: Array.from(myCollectionClaimsSet),
-    myClaims: myClaimIds ? Array.from(myClaimIds) : null,
-  };
-};
-
-reducers[ACTIONS.FETCH_COLLECTION_LIST_FAILED] = (state: State): State => {
-  return { ...state, fetchingMyCollections: false };
-};
-
 reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_STARTED] = (state: State, action: any): State => {
   const { uri, page } = action.data;
   const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims);
@@ -479,8 +386,9 @@ reducers[ACTIONS.ABANDON_CLAIM_STARTED] = (state: State, action: any): State =>
 reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State => {
   const { claims: pendingClaims }: { claims: Array<Claim> } = action.data;
   const byId = Object.assign({}, state.byId);
-  const pendingById = Object.assign({}, state.pendingById);
   const byUri = Object.assign({}, state.claimsByUri);
+  const pendingIds = state.pendingIds;
+  const pendingIdSet = new Set(pendingIds);
   let myClaimIds = new Set(state.myClaims);
   const myChannelClaims = new Set(state.myChannelClaims);
 
@@ -488,7 +396,7 @@ reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State =>
   pendingClaims.forEach((claim: Claim) => {
     let newClaim;
     const { permanent_url: uri, claim_id: claimId, type, value_type: valueType } = claim;
-    pendingById[claimId] = claim; // make sure we don't need to merge?
+    pendingIdSet.add(claimId);
     const oldClaim = byId[claimId];
     if (oldClaim && oldClaim.canonical_url) {
       newClaim = mergeClaim(oldClaim, claim);
@@ -508,22 +416,21 @@ reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State =>
   return Object.assign({}, state, {
     myClaims: Array.from(myClaimIds),
     byId,
-    pendingById,
     myChannelClaims: Array.from(myChannelClaims),
     claimsByUri: byUri,
+    pendingIds: Array.from(pendingIdSet),
   });
 };
 
 reducers[ACTIONS.UPDATE_CONFIRMED_CLAIMS] = (state: State, action: any): State => {
-  const {
-    claims: confirmedClaims,
-    pending: pendingClaims,
-  }: { claims: Array<Claim>, pending: { [string]: Claim } } = action.data;
+  const { claims: confirmedClaims }: { claims: Array<Claim> } = action.data;
   const byId = Object.assign({}, state.byId);
   const byUri = Object.assign({}, state.claimsByUri);
-  //
+  const pendingIds = state.pendingIds;
+  const pendingIdSet = new Set(pendingIds);
+
   confirmedClaims.forEach((claim: GenericClaim) => {
-    const { claim_id: claimId, type } = claim;
+    const { permanent_url: permanentUri, claim_id: claimId, type } = claim;
     let newClaim = claim;
     const oldClaim = byId[claimId];
     if (oldClaim && oldClaim.canonical_url) {
@@ -531,10 +438,11 @@ reducers[ACTIONS.UPDATE_CONFIRMED_CLAIMS] = (state: State, action: any): State =
     }
     if (type && type.match(/claim|update|channel/)) {
       byId[claimId] = newClaim;
+      pendingIdSet.delete(claimId);
     }
   });
   return Object.assign({}, state, {
-    pendingById: pendingClaims,
+    pendingIds: Array.from(pendingIdSet),
     byId,
     claimsByUri: byUri,
   });
@@ -546,7 +454,6 @@ reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = (state: State, action: any): State =
   const newMyClaims = state.myClaims ? state.myClaims.slice() : [];
   const newMyChannelClaims = state.myChannelClaims ? state.myChannelClaims.slice() : [];
   const claimsByUri = Object.assign({}, state.claimsByUri);
-  const newMyCollectionClaims = state.myCollectionClaims ? state.myCollectionClaims.slice() : [];
 
   Object.keys(claimsByUri).forEach(uri => {
     if (claimsByUri[uri] === claimId) {
@@ -555,14 +462,12 @@ reducers[ACTIONS.ABANDON_CLAIM_SUCCEEDED] = (state: State, action: any): State =
   });
   const myClaims = newMyClaims.filter(i => i !== claimId);
   const myChannelClaims = newMyChannelClaims.filter(i => i !== claimId);
-  const myCollectionClaims = newMyCollectionClaims.filter(i => i !== claimId);
 
   delete byId[claimId];
 
   return Object.assign({}, state, {
     myClaims,
     myChannelClaims,
-    myCollectionClaims,
     byId,
     claimsByUri,
   });
@@ -614,61 +519,6 @@ reducers[ACTIONS.UPDATE_CHANNEL_FAILED] = (state: State, action: any): State =>
   });
 };
 
-reducers[ACTIONS.CLEAR_COLLECTION_ERRORS] = (state: State): State => ({
-  ...state,
-  createCollectionError: null,
-  updateCollectionError: null,
-});
-
-reducers[ACTIONS.COLLECTION_PUBLISH_STARTED] = (state: State): State => ({
-  ...state,
-  creatingCollection: true,
-  createCollectionError: null,
-});
-
-reducers[ACTIONS.COLLECTION_PUBLISH_COMPLETED] = (state: State, action: any): State => {
-  const myCollections = state.myCollectionClaims || [];
-  const myClaims = state.myClaims || [];
-  const { claimId } = action.data;
-  let myClaimIds = new Set(myClaims);
-  let myCollectionClaimsSet = new Set(myCollections);
-  myClaimIds.add(claimId);
-  myCollectionClaimsSet.add(claimId);
-  return Object.assign({}, state, {
-    creatingCollection: false,
-    myClaims: Array.from(myClaimIds),
-    myCollectionClaims: Array.from(myCollectionClaimsSet),
-  });
-};
-
-reducers[ACTIONS.COLLECTION_PUBLISH_FAILED] = (state: State, action: any): State => {
-  return Object.assign({}, state, {
-    creatingCollection: false,
-    createCollectionError: action.data.error,
-  });
-};
-
-reducers[ACTIONS.COLLECTION_PUBLISH_UPDATE_STARTED] = (state: State, action: any): State => {
-  return Object.assign({}, state, {
-    updateCollectionError: '',
-    updatingCollection: true,
-  });
-};
-
-reducers[ACTIONS.COLLECTION_PUBLISH_UPDATE_COMPLETED] = (state: State, action: any): State => {
-  return Object.assign({}, state, {
-    updateCollectionError: '',
-    updatingCollection: false,
-  });
-};
-
-reducers[ACTIONS.COLLECTION_PUBLISH_UPDATE_FAILED] = (state: State, action: any): State => {
-  return Object.assign({}, state, {
-    updateCollectionError: action.data.error,
-    updatingCollection: false,
-  });
-};
-
 reducers[ACTIONS.IMPORT_CHANNEL_STARTED] = (state: State): State =>
   Object.assign({}, state, { pendingChannelImports: true });
 
@@ -720,23 +570,13 @@ reducers[ACTIONS.CLAIM_SEARCH_FAILED] = (state: State, action: any): State => {
   const { query } = action.data;
   const claimSearchByQuery = Object.assign({}, state.claimSearchByQuery);
   const fetchingClaimSearchByQuery = Object.assign({}, state.fetchingClaimSearchByQuery);
-  const claimSearchByQueryLastPageReached = Object.assign(
-    {},
-    state.claimSearchByQueryLastPageReached
-  );
 
   delete fetchingClaimSearchByQuery[query];
-
-  if (claimSearchByQuery[query] && claimSearchByQuery[query].length !== 0) {
-    claimSearchByQueryLastPageReached[query] = true;
-  } else {
-    claimSearchByQuery[query] = null;
-  }
+  claimSearchByQuery[query] = null;
 
   return Object.assign({}, state, {
     fetchingClaimSearchByQuery,
     claimSearchByQuery,
-    claimSearchByQueryLastPageReached,
   });
 };
 
diff --git a/src/redux/reducers/collections.js b/src/redux/reducers/collections.js
deleted file mode 100644
index 39aac44..0000000
--- a/src/redux/reducers/collections.js
+++ /dev/null
@@ -1,239 +0,0 @@
-// @flow
-import { handleActions } from 'util/redux-utils';
-import * as ACTIONS from 'constants/action_types';
-import * as COLS from 'constants/collections';
-
-const getTimestamp = () => {
-  return Math.floor(Date.now() / 1000);
-};
-
-const defaultState: CollectionState = {
-  builtin: {
-    watchlater: {
-      items: [],
-      id: COLS.WATCH_LATER_ID,
-      name: 'Watch Later',
-      updatedAt: getTimestamp(),
-      type: COLS.COL_TYPE_PLAYLIST,
-    },
-    favorites: {
-      items: [],
-      id: COLS.FAVORITES_ID,
-      name: 'Favorites',
-      type: COLS.COL_TYPE_PLAYLIST,
-      updatedAt: getTimestamp(),
-    },
-  },
-  resolved: {},
-  unpublished: {}, // sync
-  edited: {},
-  pending: {},
-  saved: [],
-  isResolvingCollectionById: {},
-  error: null,
-};
-
-const collectionsReducer = handleActions(
-  {
-    [ACTIONS.COLLECTION_NEW]: (state, action) => {
-      const { entry: params } = action.data; // { id:, items: Array<string>}
-      // entry
-      const newListTemplate = {
-        id: params.id,
-        name: params.name,
-        items: [],
-        updatedAt: getTimestamp(),
-        type: params.type,
-      };
-
-      const newList = Object.assign({}, newListTemplate, { ...params });
-      const { unpublished: lists } = state;
-      const newLists = Object.assign({}, lists, { [params.id]: newList });
-
-      return {
-        ...state,
-        unpublished: newLists,
-      };
-    },
-
-    [ACTIONS.COLLECTION_DELETE]: (state, action) => {
-      const { id, collectionKey } = action.data;
-      const { edited: editList, unpublished: unpublishedList, pending: pendingList } = state;
-      const newEditList = Object.assign({}, editList);
-      const newUnpublishedList = Object.assign({}, unpublishedList);
-
-      const newPendingList = Object.assign({}, pendingList);
-
-      if (collectionKey && state[collectionKey] && state[collectionKey][id]) {
-        const newList = Object.assign({}, state[collectionKey]);
-        delete newList[id];
-        return {
-          ...state,
-          [collectionKey]: newList,
-        };
-      } else {
-        if (newEditList[id]) {
-          delete newEditList[id];
-        } else if (newUnpublishedList[id]) {
-          delete newUnpublishedList[id];
-        } else if (newPendingList[id]) {
-          delete newPendingList[id];
-        }
-      }
-      return {
-        ...state,
-        edited: newEditList,
-        unpublished: newUnpublishedList,
-        pending: newPendingList,
-      };
-    },
-
-    [ACTIONS.COLLECTION_PENDING]: (state, action) => {
-      const { localId, claimId } = action.data;
-      const {
-        resolved: resolvedList,
-        edited: editList,
-        unpublished: unpublishedList,
-        pending: pendingList,
-      } = state;
-
-      const newEditList = Object.assign({}, editList);
-      const newResolvedList = Object.assign({}, resolvedList);
-      const newUnpublishedList = Object.assign({}, unpublishedList);
-      const newPendingList = Object.assign({}, pendingList);
-
-      if (localId) {
-        // new publish
-        newPendingList[claimId] = Object.assign({}, newUnpublishedList[localId] || {});
-        delete newUnpublishedList[localId];
-      } else {
-        // edit update
-        newPendingList[claimId] = Object.assign(
-          {},
-          newEditList[claimId] || newResolvedList[claimId]
-        );
-        delete newEditList[claimId];
-      }
-
-      return {
-        ...state,
-        edited: newEditList,
-        unpublished: newUnpublishedList,
-        pending: newPendingList,
-      };
-    },
-
-    [ACTIONS.COLLECTION_EDIT]: (state, action) => {
-      const { id, collectionKey, collection } = action.data;
-
-      if (COLS.BUILTIN_LISTS.includes(id)) {
-        const { builtin: lists } = state;
-        return {
-          ...state,
-          [collectionKey]: { ...lists, [id]: collection },
-        };
-      }
-
-      if (collectionKey === 'edited') {
-        const { edited: lists } = state;
-        return {
-          ...state,
-          edited: { ...lists, [id]: collection },
-        };
-      }
-      const { unpublished: lists } = state;
-      return {
-        ...state,
-        unpublished: { ...lists, [id]: collection },
-      };
-    },
-
-    [ACTIONS.COLLECTION_ERROR]: (state, action) => {
-      return Object.assign({}, state, {
-        error: action.data.message,
-      });
-    },
-
-    [ACTIONS.COLLECTION_ITEMS_RESOLVE_STARTED]: (state, action) => {
-      const { ids } = action.data;
-      const { isResolvingCollectionById } = state;
-      const newResolving = Object.assign({}, isResolvingCollectionById);
-      ids.forEach(id => {
-        newResolving[id] = true;
-      });
-      return Object.assign({}, state, {
-        ...state,
-        error: '',
-        isResolvingCollectionById: newResolving,
-      });
-    },
-    [ACTIONS.USER_STATE_POPULATE]: (state, action) => {
-      const {
-        builtinCollections,
-        savedCollections,
-        unpublishedCollections,
-        editedCollections,
-      } = action.data;
-      return {
-        ...state,
-        edited: editedCollections || state.edited,
-        unpublished: unpublishedCollections || state.unpublished,
-        builtin: builtinCollections || state.builtin,
-        saved: savedCollections || state.saved,
-      };
-    },
-    [ACTIONS.COLLECTION_ITEMS_RESOLVE_COMPLETED]: (state, action) => {
-      const { resolvedCollections, failedCollectionIds } = action.data;
-      const { pending, edited, isResolvingCollectionById, resolved } = state;
-      const newPending = Object.assign({}, pending);
-      const newEdited = Object.assign({}, edited);
-      const newResolved = Object.assign({}, resolved, resolvedCollections);
-
-      const resolvedIds = Object.keys(resolvedCollections);
-      const newResolving = Object.assign({}, isResolvingCollectionById);
-      if (resolvedCollections && Object.keys(resolvedCollections).length) {
-        resolvedIds.forEach(resolvedId => {
-          if (newEdited[resolvedId]) {
-            if (newEdited[resolvedId]['updatedAt'] < resolvedCollections[resolvedId]['updatedAt']) {
-              delete newEdited[resolvedId];
-            }
-          }
-          delete newResolving[resolvedId];
-          if (newPending[resolvedId]) {
-            delete newPending[resolvedId];
-          }
-        });
-      }
-
-      if (failedCollectionIds && Object.keys(failedCollectionIds).length) {
-        failedCollectionIds.forEach(failedId => {
-          delete newResolving[failedId];
-        });
-      }
-
-      return Object.assign({}, state, {
-        ...state,
-        pending: newPending,
-        resolved: newResolved,
-        edited: newEdited,
-        isResolvingCollectionById: newResolving,
-      });
-    },
-    [ACTIONS.COLLECTION_ITEMS_RESOLVE_FAILED]: (state, action) => {
-      const { ids } = action.data;
-      const { isResolvingCollectionById } = state;
-      const newResolving = Object.assign({}, isResolvingCollectionById);
-      ids.forEach(id => {
-        delete newResolving[id];
-      });
-      return Object.assign({}, state, {
-        ...state,
-        isResolvingCollectionById: newResolving,
-        error: action.data.message,
-      });
-    },
-  },
-  defaultState
-);
-
-export { collectionsReducer };
diff --git a/src/redux/reducers/publish.js b/src/redux/reducers/publish.js
index 794c43d..2c602bf 100644
--- a/src/redux/reducers/publish.js
+++ b/src/redux/reducers/publish.js
@@ -9,7 +9,6 @@ type PublishState = {
   editingURI: ?string,
   fileText: ?string,
   filePath: ?string,
-  remoteFileUrl: ?string,
   contentIsFree: boolean,
   fileDur: number,
   fileSize: number,
@@ -22,11 +21,8 @@ type PublishState = {
   thumbnail_url: string,
   thumbnailPath: string,
   uploadThumbnailStatus: string,
-  thumbnailError: ?boolean,
   description: string,
   language: string,
-  releaseTime: ?number,
-  releaseTimeEdited: ?number,
   channel: string,
   channelId: ?string,
   name: string,
@@ -47,7 +43,6 @@ const defaultState: PublishState = {
   fileDur: 0,
   fileSize: 0,
   fileVid: false,
-  remoteFileUrl: undefined,
   contentIsFree: true,
   fee: {
     amount: 1,
@@ -57,17 +52,14 @@ const defaultState: PublishState = {
   thumbnail_url: '',
   thumbnailPath: '',
   uploadThumbnailStatus: THUMBNAIL_STATUSES.API_DOWN,
-  thumbnailError: undefined,
   description: '',
   language: '',
-  releaseTime: undefined,
-  releaseTimeEdited: undefined,
   nsfw: false,
   channel: CHANNEL_ANONYMOUS,
   channelId: '',
   name: '',
   nameError: undefined,
-  bid: 0.01,
+  bid: 0.1,
   bidError: undefined,
   licenseType: 'None',
   otherLicenseDescription: 'All rights reserved',
@@ -91,11 +83,9 @@ export const publishReducer = handleActions(
     },
     [ACTIONS.CLEAR_PUBLISH]: (state: PublishState): PublishState => ({
       ...defaultState,
-      uri: undefined,
       channel: state.channel,
       bid: state.bid,
       optimize: state.optimize,
-      language: state.language,
     }),
     [ACTIONS.PUBLISH_START]: (state: PublishState): PublishState => ({
       ...state,
diff --git a/src/redux/reducers/tags.js b/src/redux/reducers/tags.js
new file mode 100644
index 0000000..b465376
--- /dev/null
+++ b/src/redux/reducers/tags.js
@@ -0,0 +1,86 @@
+// @flow
+import * as ACTIONS from 'constants/action_types';
+import { handleActions } from 'util/redux-utils';
+import { DEFAULT_KNOWN_TAGS, DEFAULT_FOLLOWED_TAGS } from 'constants/tags';
+
+function getDefaultKnownTags() {
+  return DEFAULT_FOLLOWED_TAGS.concat(DEFAULT_KNOWN_TAGS).reduce(
+    (tagsMap, tag) => ({
+      ...tagsMap,
+      [tag]: { name: tag },
+    }),
+    {}
+  );
+}
+
+const defaultState: TagState = {
+  followedTags: [],
+  knownTags: getDefaultKnownTags(),
+};
+
+export const tagsReducer = handleActions(
+  {
+    [ACTIONS.TOGGLE_TAG_FOLLOW]: (state: TagState, action: TagAction): TagState => {
+      const { followedTags } = state;
+      const { name } = action.data;
+
+      let newFollowedTags = followedTags.slice();
+
+      if (newFollowedTags.includes(name)) {
+        newFollowedTags = newFollowedTags.filter(tag => tag !== name);
+      } else {
+        newFollowedTags.push(name);
+      }
+
+      return {
+        ...state,
+        followedTags: newFollowedTags,
+      };
+    },
+
+    [ACTIONS.TAG_ADD]: (state: TagState, action: TagAction) => {
+      const { knownTags } = state;
+      const { name } = action.data;
+
+      let newKnownTags = { ...knownTags };
+      newKnownTags[name] = { name };
+
+      return {
+        ...state,
+        knownTags: newKnownTags,
+      };
+    },
+
+    [ACTIONS.TAG_DELETE]: (state: TagState, action: TagAction) => {
+      const { knownTags, followedTags } = state;
+      const { name } = action.data;
+
+      let newKnownTags = { ...knownTags };
+      delete newKnownTags[name];
+      const newFollowedTags = followedTags.filter(tag => tag !== name);
+
+      return {
+        ...state,
+        knownTags: newKnownTags,
+        followedTags: newFollowedTags,
+      };
+    },
+    [ACTIONS.USER_STATE_POPULATE]: (
+      state: TagState,
+      action: { data: { tags: ?Array<string> } }
+    ) => {
+      const { tags } = action.data;
+      if (Array.isArray(tags)) {
+        return {
+          ...state,
+          followedTags: tags,
+        };
+      }
+      return {
+        ...state,
+      };
+
+    },
+  },
+  defaultState
+);
diff --git a/src/redux/reducers/wallet.js b/src/redux/reducers/wallet.js
index 6dd1917..d4e894b 100644
--- a/src/redux/reducers/wallet.js
+++ b/src/redux/reducers/wallet.js
@@ -45,17 +45,10 @@ type WalletState = {
   walletLockResult: ?boolean,
   walletReconnecting: boolean,
   txoFetchParams: {},
-  utxoCounts: {},
   txoPage: any,
-  fetchId: string,
   fetchingTxos: boolean,
   fetchingTxosError?: string,
-  consolidatingUtxos: boolean,
-  pendingConsolidateTxid?: string,
-  massClaimingTips: boolean,
-  pendingMassClaimTxid?: string,
   pendingSupportTransactions: {}, // { claimId: {txid: 123, amount 12.3}, }
-  pendingTxos: Array<string>,
   abandonClaimSupportError?: string,
 };
 
@@ -92,20 +85,10 @@ const defaultState = {
   transactionListFilter: 'all',
   walletReconnecting: false,
   txoFetchParams: {},
-  utxoCounts: {},
-  fetchingUtxoCounts: false,
-  fetchingUtxoError: undefined,
-  consolidatingUtxos: false,
-  pendingConsolidateTxid: null,
-  massClaimingTips: false,
-  pendingMassClaimTxid: null,
   txoPage: {},
-  fetchId: '',
   fetchingTxos: false,
   fetchingTxosError: undefined,
   pendingSupportTransactions: {},
-  pendingTxos: [],
-
   abandonClaimSupportError: undefined,
 };
 
@@ -131,26 +114,18 @@ export const walletReducer = handleActions(
       };
     },
 
-    [ACTIONS.FETCH_TXO_PAGE_STARTED]: (state: WalletState, action) => {
+    [ACTIONS.FETCH_TXO_PAGE_STARTED]: (state: WalletState) => {
       return {
         ...state,
-        fetchId: action.data,
         fetchingTxos: true,
         fetchingTxosError: undefined,
       };
     },
 
     [ACTIONS.FETCH_TXO_PAGE_COMPLETED]: (state: WalletState, action) => {
-      if (state.fetchId !== action.data.fetchId) {
-        // Leave 'state' and 'fetchingTxos' alone. The latter would ensure
-        // the spiner would continue spinning for the latest transaction.
-        return { ...state };
-      }
-
       return {
         ...state,
-        txoPage: action.data.result,
-        fetchId: '',
+        txoPage: action.data,
         fetchingTxos: false,
       };
     },
@@ -159,104 +134,10 @@ export const walletReducer = handleActions(
       return {
         ...state,
         txoPage: {},
-        fetchId: '',
         fetchingTxos: false,
         fetchingTxosError: action.data,
       };
     },
-    [ACTIONS.FETCH_UTXO_COUNT_STARTED]: (state: WalletState) => {
-      return {
-        ...state,
-        fetchingUtxoCounts: true,
-        fetchingUtxoError: undefined,
-      };
-    },
-
-    [ACTIONS.FETCH_UTXO_COUNT_COMPLETED]: (state: WalletState, action) => {
-      return {
-        ...state,
-        utxoCounts: action.data,
-        fetchingUtxoCounts: false,
-      };
-    },
-    [ACTIONS.FETCH_UTXO_COUNT_FAILED]: (state: WalletState, action) => {
-      return {
-        ...state,
-        utxoCounts: {},
-        fetchingUtxoCounts: false,
-        fetchingUtxoError: action.data,
-      };
-    },
-    [ACTIONS.DO_UTXO_CONSOLIDATE_STARTED]: (state: WalletState) => {
-      return {
-        ...state,
-        consolidatingUtxos: true,
-      };
-    },
-
-    [ACTIONS.DO_UTXO_CONSOLIDATE_COMPLETED]: (state: WalletState, action) => {
-      const { txid } = action.data;
-      return {
-        ...state,
-        consolidatingUtxos: false,
-        pendingConsolidateTxid: txid,
-      };
-    },
-
-    [ACTIONS.DO_UTXO_CONSOLIDATE_FAILED]: (state: WalletState, action) => {
-      return {
-        ...state,
-        consolidatingUtxos: false,
-      };
-    },
-
-    [ACTIONS.TIP_CLAIM_MASS_STARTED]: (state: WalletState) => {
-      return {
-        ...state,
-        massClaimingTips: true,
-      };
-    },
-
-    [ACTIONS.TIP_CLAIM_MASS_COMPLETED]: (state: WalletState, action) => {
-      const { txid } = action.data;
-      return {
-        ...state,
-        massClaimingTips: false,
-        pendingMassClaimTxid: txid,
-      };
-    },
-
-    [ACTIONS.TIP_CLAIM_MASS_FAILED]: (state: WalletState, action) => {
-      return {
-        ...state,
-        massClaimingTips: false,
-      };
-    },
-
-    [ACTIONS.PENDING_CONSOLIDATED_TXOS_UPDATED]: (state: WalletState, action) => {
-      const { pendingTxos, pendingMassClaimTxid, pendingConsolidateTxid } = state;
-
-      const { txids, remove } = action.data;
-
-      if (remove) {
-        const newTxos = pendingTxos.filter(txo => !txids.includes(txo));
-        const newPendingMassClaimTxid = txids.includes(pendingMassClaimTxid)
-          ? undefined
-          : pendingMassClaimTxid;
-        const newPendingConsolidateTxid = txids.includes(pendingConsolidateTxid)
-          ? undefined
-          : pendingConsolidateTxid;
-        return {
-          ...state,
-          pendingTxos: newTxos,
-          pendingMassClaimTxid: newPendingMassClaimTxid,
-          pendingConsolidateTxid: newPendingConsolidateTxid,
-        };
-      } else {
-        const newPendingSet = new Set([...pendingTxos, ...txids]);
-        return { ...state, pendingTxos: Array.from(newPendingSet) };
-      }
-    },
 
     [ACTIONS.UPDATE_TXO_FETCH_PARAMS]: (state: WalletState, action) => {
       return {
@@ -305,7 +186,7 @@ export const walletReducer = handleActions(
       return {
         ...state,
         supports: byOutpoint,
-        abandoningSupportsByOutpoint: currentlyAbandoning,
+        abandoningSupportsById: currentlyAbandoning,
       };
     },
 
@@ -324,15 +205,10 @@ export const walletReducer = handleActions(
     },
 
     [ACTIONS.ABANDON_CLAIM_SUPPORT_COMPLETED]: (state: WalletState, action: any): WalletState => {
-      const {
-        claimId,
-        type,
-        txid,
-        effective,
-      }: { claimId: string, type: string, txid: string, effective: string } = action.data;
+      const { claimId, type, txid, effective }: { claimId: string, type: string, txid: string, effective: string } = action.data;
       const pendingtxs = Object.assign({}, state.pendingSupportTransactions);
 
-      pendingtxs[claimId] = { txid, type, effective };
+      pendingtxs[claimId] = {txid, type, effective};
 
       return {
         ...state,
@@ -349,6 +225,7 @@ export const walletReducer = handleActions(
     },
 
     [ACTIONS.PENDING_SUPPORTS_UPDATED]: (state: WalletState, action: any): WalletState => {
+
       return {
         ...state,
         pendingSupportTransactions: action.data,
diff --git a/src/redux/selectors/claims.js b/src/redux/selectors/claims.js
index f5a03ed..2273a43 100644
--- a/src/redux/selectors/claims.js
+++ b/src/redux/selectors/claims.js
@@ -1,30 +1,17 @@
 // @flow
-import { normalizeURI, parseURI } from 'lbryURI';
+import { normalizeURI, buildURI, parseURI } from 'lbryURI';
 import { selectSupportsByOutpoint } from 'redux/selectors/wallet';
 import { createSelector } from 'reselect';
 import { isClaimNsfw, filterClaims } from 'util/claim';
-import * as CLAIM from 'constants/claim';
+import { PAGE_SIZE } from 'constants/claim';
 
 const selectState = state => state.claims || {};
 
-export const selectById = createSelector(
+export const selectClaimsById = createSelector(
   selectState,
   state => state.byId || {}
 );
 
-export const selectPendingClaimsById = createSelector(
-  selectState,
-  state => state.pendingById || {}
-);
-
-export const selectClaimsById = createSelector(
-  selectById,
-  selectPendingClaimsById,
-  (byId, pendingById) => {
-    return Object.assign(byId, pendingById); // do I need merged to keep metadata?
-  }
-);
-
 export const selectClaimIdsByUri = createSelector(
   selectState,
   state => state.claimsByUri || {}
@@ -85,53 +72,28 @@ export const selectAllClaimsByChannel = createSelector(
 
 export const selectPendingIds = createSelector(
   selectState,
-  state => Object.keys(state.pendingById) || []
-);
-
-export const selectPendingClaims = createSelector(
-  selectPendingClaimsById,
-  pendingById => Object.values(pendingById)
+  state => state.pendingIds || []
 );
 
 export const makeSelectClaimIsPending = (uri: string) =>
   createSelector(
     selectClaimIdsByUri,
-    selectPendingClaimsById,
-    (idsByUri, pendingById) => {
+    selectPendingIds,
+    (idsByUri, pendingIds) => {
       const claimId = idsByUri[normalizeURI(uri)];
 
       if (claimId) {
-        return Boolean(pendingById[claimId]);
+        return pendingIds.some(i => i === claimId);
       }
       return false;
     }
   );
 
-export const makeSelectClaimIdIsPending = (claimId: string) =>
-  createSelector(
-    selectPendingClaimsById,
-    pendingById => {
-      return Boolean(pendingById[claimId]);
-    }
-  );
-
-export const makeSelectClaimIdForUri = (uri: string) =>
-  createSelector(
-    selectClaimIdsByUri,
-    claimIds => claimIds[uri]
-  );
-
 export const selectReflectingById = createSelector(
   selectState,
   state => state.reflectingById
 );
 
-export const makeSelectClaimForClaimId = (claimId: string) =>
-  createSelector(
-    selectClaimsById,
-    byId => byId[claimId]
-  );
-
 export const makeSelectClaimForUri = (uri: string, returnRepost: boolean = true) =>
   createSelector(
     selectClaimIdsByUri,
@@ -157,17 +119,14 @@ export const makeSelectClaimForUri = (uri: string, returnRepost: boolean = true)
           return undefined;
         }
 
-        const repostedClaim = claim && claim.reposted_claim;
+        const repostedClaim = claim.reposted_claim;
         if (repostedClaim && returnRepost) {
-          const channelUrl =
-            claim.signing_channel &&
-            (claim.signing_channel.canonical_url || claim.signing_channel.permanent_url);
+          const channelUrl = claim.signing_channel && claim.signing_channel.canonical_url;
 
           return {
             ...repostedClaim,
-            repost_url: normalizeURI(uri),
+            repost_url: uri,
             repost_channel_url: channelUrl,
-            repost_bid_amount: claim && claim.meta && claim.meta.effective_amount,
           };
         } else {
           return claim;
@@ -201,11 +160,10 @@ export const selectAbandoningIds = createSelector(
   state => Object.keys(state.abandoningById || {})
 );
 
-export const makeSelectAbandoningClaimById = (claimId: string) =>
-  createSelector(
-    selectAbandoningIds,
-    ids => ids.includes(claimId)
-  );
+export const makeSelectAbandoningClaimById = (claimId: string) => createSelector(
+  selectAbandoningIds,
+  ids => ids.includes(claimId)
+);
 
 export const makeSelectIsAbandoningClaimForUri = (uri: string) =>
   createSelector(
@@ -295,8 +253,8 @@ export const makeSelectMyPurchasesForPage = (query: ?string, page: number = 1) =
 
       const fileInfos = myPurchases.map(uri => claimsByUri[uri]);
       const matchingFileInfos = filterClaims(fileInfos, query);
-      const start = (Number(page) - 1) * Number(CLAIM.PAGE_SIZE);
-      const end = Number(page) * Number(CLAIM.PAGE_SIZE);
+      const start = (Number(page) - 1) * Number(PAGE_SIZE);
+      const end = Number(page) * Number(PAGE_SIZE);
       return matchingFileInfos && matchingFileInfos.length
         ? matchingFileInfos
           .slice(start, end)
@@ -338,7 +296,6 @@ export const makeSelectClaimsInChannelForPage = (uri: string, page?: number) =>
     }
   );
 
-// THIS IS LEFT OVER FROM ONE TAB CHANNEL_CONTENT
 export const makeSelectTotalClaimsInChannelSearch = (uri: string) =>
   createSelector(
     selectClaimsById,
@@ -349,7 +306,6 @@ export const makeSelectTotalClaimsInChannelSearch = (uri: string) =>
     }
   );
 
-// THIS IS LEFT OVER FROM ONE_TAB CHANNEL CONTENT
 export const makeSelectTotalPagesInChannelSearch = (uri: string) =>
   createSelector(
     selectClaimsById,
@@ -360,6 +316,21 @@ export const makeSelectTotalPagesInChannelSearch = (uri: string) =>
     }
   );
 
+export const makeSelectClaimsInChannelForCurrentPageState = (uri: string) =>
+  createSelector(
+    selectClaimsById,
+    selectAllClaimsByChannel,
+    selectCurrentChannelPage,
+    (byId, allClaims, page) => {
+      const byChannel = allClaims[uri] || {};
+      const claimIds = byChannel[page || 1];
+
+      if (!claimIds) return claimIds;
+
+      return claimIds.map(claimId => byId[claimId]);
+    }
+  );
+
 export const makeSelectMetadataForUri = (uri: string) =>
   createSelector(
     makeSelectClaimForUri(uri),
@@ -411,19 +382,6 @@ export const makeSelectAmountForUri = (uri: string) =>
     }
   );
 
-export const makeSelectEffectiveAmountForUri = (uri: string) =>
-  createSelector(
-    makeSelectClaimForUri(uri, false),
-    claim => {
-      return (
-        claim &&
-        claim.meta &&
-        typeof claim.meta.effective_amount === 'string' &&
-        Number(claim.meta.effective_amount)
-      );
-    }
-  );
-
 export const makeSelectContentTypeForUri = (uri: string) =>
   createSelector(
     makeSelectClaimForUri(uri),
@@ -500,9 +458,7 @@ export const selectMyClaims = createSelector(
 export const selectMyClaimsWithoutChannels = createSelector(
   selectMyClaims,
   myClaims =>
-    myClaims
-      .filter(claim => claim && !claim.name.match(/^@/))
-      .sort((a, b) => a.timestamp - b.timestamp)
+    myClaims.filter(claim => !claim.name.match(/^@/)).sort((a, b) => a.timestamp - b.timestamp)
 );
 
 export const selectMyClaimUrisWithoutChannels = createSelector(
@@ -546,11 +502,6 @@ export const selectFetchingMyChannels = createSelector(
   state => state.fetchingMyChannels
 );
 
-export const selectFetchingMyCollections = createSelector(
-  selectState,
-  state => state.fetchingMyCollections
-);
-
 export const selectMyChannelClaims = createSelector(
   selectState,
   selectClaimsById,
@@ -577,11 +528,6 @@ export const selectMyChannelUrls = createSelector(
   claims => (claims ? claims.map(claim => claim.canonical_url || claim.permanent_url) : undefined)
 );
 
-export const selectMyCollectionIds = createSelector(
-  selectState,
-  state => state.myCollectionClaims
-);
-
 export const selectResolvingUris = createSelector(
   selectState,
   state => state.resolvingUris || []
@@ -608,35 +554,16 @@ export const selectChannelClaimCounts = createSelector(
   state => state.channelClaimCounts || {}
 );
 
-export const makeSelectPendingClaimForUri = (uri: string) =>
-  createSelector(
-    selectPendingClaimsById,
-    pendingById => {
-      let uriStreamName;
-      let uriChannelName;
-      try {
-        ({ streamName: uriStreamName, channelName: uriChannelName } = parseURI(uri));
-      } catch (e) {
-        return null;
-      }
-      const pendingClaims = (Object.values(pendingById): any);
-      const matchingClaim = pendingClaims.find((claim: GenericClaim) => {
-        return claim.normalized_name === uriChannelName || claim.normalized_name === uriStreamName;
-      });
-      return matchingClaim || null;
-    }
-  );
-
 export const makeSelectTotalItemsForChannel = (uri: string) =>
   createSelector(
     selectChannelClaimCounts,
-    byUri => byUri && byUri[normalizeURI(uri)]
+    byUri => byUri && byUri[uri]
   );
 
 export const makeSelectTotalPagesForChannel = (uri: string, pageSize: number = 10) =>
   createSelector(
     selectChannelClaimCounts,
-    byUri => byUri && byUri[uri] && Math.ceil(byUri[normalizeURI(uri)] / pageSize)
+    byUri => byUri && byUri[uri] && Math.ceil(byUri[uri] / pageSize)
   );
 
 export const makeSelectNsfwCountFromUris = (uris: Array<string>) =>
@@ -652,6 +579,27 @@ export const makeSelectNsfwCountFromUris = (uris: Array<string>) =>
       }, 0)
   );
 
+export const makeSelectNsfwCountForChannel = (uri: string) =>
+  createSelector(
+    selectClaimsById,
+    selectAllClaimsByChannel,
+    selectCurrentChannelPage,
+    (byId, allClaims, page) => {
+      const byChannel = allClaims[uri] || {};
+      const claimIds = byChannel[page || 1];
+
+      if (!claimIds) return 0;
+
+      return claimIds.reduce((acc, claimId) => {
+        const claim = byId[claimId];
+        if (isClaimNsfw(claim)) {
+          return acc + 1;
+        }
+        return acc;
+      }, 0);
+    }
+  );
+
 export const makeSelectOmittedCountForChannel = (uri: string) =>
   createSelector(
     makeSelectTotalItemsForChannel(uri),
@@ -700,29 +648,6 @@ export const makeSelectChannelForClaimUri = (uri: string, includePrefix: boolean
     }
   );
 
-export const makeSelectChannelPermUrlForClaimUri = (uri: string, includePrefix: boolean = false) =>
-  createSelector(
-    makeSelectClaimForUri(uri),
-    (claim: ?Claim) => {
-      if (claim && claim.value_type === 'channel') {
-        return claim.permanent_url;
-      }
-      if (!claim || !claim.signing_channel || !claim.is_channel_signature_valid) {
-        return null;
-      }
-      return claim.signing_channel.permanent_url;
-    }
-  );
-
-export const makeSelectMyChannelPermUrlForName = (name: string) =>
-  createSelector(
-    selectMyChannelClaims,
-    claims => {
-      const matchingClaim = claims && claims.find(claim => claim.name === name);
-      return matchingClaim ? matchingClaim.permanent_url : null;
-    }
-  );
-
 export const makeSelectTagsForUri = (uri: string) =>
   createSelector(
     makeSelectMetadataForUri(uri),
@@ -815,8 +740,8 @@ export const makeSelectMyStreamUrlsForPage = (page: number = 1) =>
   createSelector(
     selectMyClaimUrisWithoutChannels,
     urls => {
-      const start = (Number(page) - 1) * Number(CLAIM.PAGE_SIZE);
-      const end = Number(page) * Number(CLAIM.PAGE_SIZE);
+      const start = (Number(page) - 1) * Number(PAGE_SIZE);
+      const end = Number(page) * Number(PAGE_SIZE);
 
       return urls && urls.length ? urls.slice(start, end) : [];
     }
@@ -826,97 +751,3 @@ export const selectMyStreamUrlsCount = createSelector(
   selectMyClaimUrisWithoutChannels,
   channels => channels.length
 );
-
-export const makeSelectTagInClaimOrChannelForUri = (uri: string, tag: string) =>
-  createSelector(
-    makeSelectClaimForUri(uri),
-    claim => {
-      const claimTags = (claim && claim.value && claim.value.tags) || [];
-      const channelTags =
-        (claim &&
-          claim.signing_channel &&
-          claim.signing_channel.value &&
-          claim.signing_channel.value.tags) ||
-        [];
-      return claimTags.includes(tag) || channelTags.includes(tag);
-    }
-  );
-
-export const makeSelectClaimHasSource = (uri: string) =>
-  createSelector(
-    makeSelectClaimForUri(uri),
-    claim => {
-      if (!claim) {
-        return false;
-      }
-
-      return Boolean(claim.value.source);
-    }
-  );
-
-export const makeSelectClaimIsStreamPlaceholder = (uri: string) =>
-  createSelector(
-    makeSelectClaimForUri(uri),
-    claim => {
-      if (!claim) {
-        return false;
-      }
-
-      return Boolean(claim.value_type === 'stream' && !claim.value.source);
-    }
-  );
-
-export const makeSelectTotalStakedAmountForChannelUri = (uri: string) =>
-  createSelector(
-    makeSelectClaimForUri(uri),
-    claim => {
-      if (!claim || !claim.amount || !claim.meta || !claim.meta.support_amount) {
-        return 0;
-      }
-
-      return parseFloat(claim.amount) + parseFloat(claim.meta.support_amount) || 0;
-    }
-  );
-
-export const makeSelectStakedLevelForChannelUri = (uri: string) =>
-  createSelector(
-    makeSelectTotalStakedAmountForChannelUri(uri),
-    amount => {
-      let level = 1;
-      switch (true) {
-        case amount >= CLAIM.LEVEL_2_STAKED_AMOUNT && amount < CLAIM.LEVEL_3_STAKED_AMOUNT:
-          level = 2;
-          break;
-        case amount >= CLAIM.LEVEL_3_STAKED_AMOUNT && amount < CLAIM.LEVEL_4_STAKED_AMOUNT:
-          level = 3;
-          break;
-        case amount >= CLAIM.LEVEL_4_STAKED_AMOUNT && amount < CLAIM.LEVEL_5_STAKED_AMOUNT:
-          level = 4;
-          break;
-        case amount >= CLAIM.LEVEL_5_STAKED_AMOUNT:
-          level = 5;
-          break;
-      }
-      return level;
-    }
-  );
-
-export const selectUpdatingCollection = createSelector(
-  selectState,
-  state => state.updatingCollection
-);
-
-export const selectUpdateCollectionError = createSelector(
-  selectState,
-  state => state.updateCollectionError
-);
-
-export const selectCreatingCollection = createSelector(
-  selectState,
-  state => state.creatingCollection
-);
-
-export const selectCreateCollectionError = createSelector(
-  selectState,
-  state => state.createCollectionError
-);
diff --git a/src/redux/selectors/collections.js b/src/redux/selectors/collections.js
deleted file mode 100644
index 0970688..0000000
--- a/src/redux/selectors/collections.js
+++ /dev/null
@@ -1,311 +0,0 @@
-// @flow
-import fromEntries from '@ungap/from-entries';
-import { createSelector } from 'reselect';
-import {
-  selectMyCollectionIds,
-  makeSelectClaimForUri,
-  selectClaimsByUri,
-} from 'redux/selectors/claims';
-import { parseURI } from 'lbryURI';
-
-const selectState = (state: { collections: CollectionState }) => state.collections;
-
-export const selectSavedCollectionIds = createSelector(
-  selectState,
-  collectionState => collectionState.saved
-);
-
-export const selectBuiltinCollections = createSelector(
-  selectState,
-  state => state.builtin
-);
-export const selectResolvedCollections = createSelector(
-  selectState,
-  state => state.resolved
-);
-
-export const selectMyUnpublishedCollections = createSelector(
-  selectState,
-  state => state.unpublished
-);
-
-export const selectMyEditedCollections = createSelector(
-  selectState,
-  state => state.edited
-);
-
-export const selectPendingCollections = createSelector(
-  selectState,
-  state => state.pending
-);
-
-export const makeSelectEditedCollectionForId = (id: string) =>
-  createSelector(
-    selectMyEditedCollections,
-    eLists => eLists[id]
-  );
-
-export const makeSelectPendingCollectionForId = (id: string) =>
-  createSelector(
-    selectPendingCollections,
-    pending => pending[id]
-  );
-
-export const makeSelectPublishedCollectionForId = (id: string) =>
-  createSelector(
-    selectResolvedCollections,
-    rLists => rLists[id]
-  );
-
-export const makeSelectUnpublishedCollectionForId = (id: string) =>
-  createSelector(
-    selectMyUnpublishedCollections,
-    rLists => rLists[id]
-  );
-
-export const makeSelectCollectionIsMine = (id: string) =>
-  createSelector(
-    selectMyCollectionIds,
-    selectMyUnpublishedCollections,
-    selectBuiltinCollections,
-    (publicIds, privateIds, builtinIds) => {
-      return Boolean(publicIds.includes(id) || privateIds[id] || builtinIds[id]);
-    }
-  );
-
-export const selectMyPublishedCollections = createSelector(
-  selectResolvedCollections,
-  selectPendingCollections,
-  selectMyEditedCollections,
-  selectMyCollectionIds,
-  (resolved, pending, edited, myIds) => {
-    // all resolved in myIds, plus those in pending and edited
-    const myPublishedCollections = fromEntries(
-      Object.entries(pending).concat(
-        Object.entries(resolved).filter(
-          ([key, val]) =>
-            myIds.includes(key) &&
-            // $FlowFixMe
-            !pending[key]
-        )
-      )
-    );
-    // now add in edited:
-    Object.entries(edited).forEach(([id, item]) => {
-      myPublishedCollections[id] = item;
-    });
-    return myPublishedCollections;
-  }
-);
-
-export const selectMyPublishedMixedCollections = createSelector(
-  selectMyPublishedCollections,
-  published => {
-    const myCollections = fromEntries(
-      // $FlowFixMe
-      Object.entries(published).filter(([key, collection]) => {
-        // $FlowFixMe
-        return collection.type === 'collection';
-      })
-    );
-    return myCollections;
-  }
-);
-
-export const selectMyPublishedPlaylistCollections = createSelector(
-  selectMyPublishedCollections,
-  published => {
-    const myCollections = fromEntries(
-      // $FlowFixMe
-      Object.entries(published).filter(([key, collection]) => {
-        // $FlowFixMe
-        return collection.type === 'playlist';
-      })
-    );
-    return myCollections;
-  }
-);
-
-export const makeSelectMyPublishedCollectionForId = (id: string) =>
-  createSelector(
-    selectMyPublishedCollections,
-    myPublishedCollections => myPublishedCollections[id]
-  );
-
-// export const selectSavedCollections = createSelector(
-//   selectResolvedCollections,
-//   selectSavedCollectionIds,
-//   (resolved, myIds) => {
-//     const mySavedCollections = fromEntries(
-//       Object.entries(resolved).filter(([key, val]) => myIds.includes(key))
-//     );
-//     return mySavedCollections;
-//   }
-// );
-
-export const makeSelectIsResolvingCollectionForId = (id: string) =>
-  createSelector(
-    selectState,
-    state => {
-      return state.isResolvingCollectionById[id];
-    }
-  );
-
-export const makeSelectCollectionForId = (id: string) =>
-  createSelector(
-    selectBuiltinCollections,
-    selectResolvedCollections,
-    selectMyUnpublishedCollections,
-    selectMyEditedCollections,
-    selectPendingCollections,
-    (bLists, rLists, uLists, eLists, pLists) => {
-      const collection = bLists[id] || uLists[id] || eLists[id] || pLists[id] || rLists[id];
-      return collection;
-    }
-  );
-
-export const makeSelectClaimUrlInCollection = (url: string) =>
-  createSelector(
-    selectBuiltinCollections,
-    selectMyPublishedCollections,
-    selectMyUnpublishedCollections,
-    selectMyEditedCollections,
-    selectPendingCollections,
-    (bLists, myRLists, uLists, eLists, pLists) => {
-      const collections = [bLists, uLists, eLists, myRLists, pLists];
-      const itemsInCollections = [];
-      collections.map(list => {
-        Object.entries(list).forEach(([key, value]) => {
-          // $FlowFixMe
-          value.items.map(item => {
-            itemsInCollections.push(item);
-          });
-        });
-      });
-      return itemsInCollections.includes(url);
-    }
-  );
-
-export const makeSelectCollectionForIdHasClaimUrl = (id: string, url: string) =>
-  createSelector(
-    makeSelectCollectionForId(id),
-    collection => collection && collection.items.includes(url)
-  );
-
-export const makeSelectUrlsForCollectionId = (id: string) =>
-  createSelector(
-    makeSelectCollectionForId(id),
-    collection => collection && collection.items
-  );
-
-export const makeSelectClaimIdsForCollectionId = (id: string) =>
-  createSelector(
-    makeSelectCollectionForId(id),
-    collection => {
-      const items = (collection && collection.items) || [];
-      const ids = items.map(item => {
-        const { claimId } = parseURI(item);
-        return claimId;
-      });
-      return ids;
-    }
-  );
-
-export const makeSelectIndexForUrlInCollection = (url: string, id: string) =>
-  createSelector(
-    state => state.content.shuffleList,
-    makeSelectUrlsForCollectionId(id),
-    makeSelectClaimForUri(url),
-    (shuffleState, urls, claim) => {
-      const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
-      const listUrls = shuffleUrls || urls;
-
-      const index = listUrls && listUrls.findIndex(u => u === url);
-      if (index > -1) {
-        return index;
-      } else if (claim) {
-        const index = listUrls && listUrls.findIndex(u => u === claim.permanent_url);
-        if (index > -1) return index;
-        return claim;
-      }
-      return null;
-    }
-  );
-
-export const makeSelectPreviousUrlForCollectionAndUrl = (id: string, url: string) =>
-  createSelector(
-    state => state.content.shuffleList,
-    state => state.content.loopList,
-    makeSelectIndexForUrlInCollection(url, id),
-    makeSelectUrlsForCollectionId(id),
-    (shuffleState, loopState, index, urls) => {
-      const loopList = loopState && loopState.collectionId === id && loopState.loop;
-      const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
-
-      if (index > -1) {
-        const listUrls = shuffleUrls || urls;
-        let nextUrl;
-        if (index === 0 && loopList) {
-          nextUrl = listUrls[listUrls.length - 1];
-        } else {
-          nextUrl = listUrls[index - 1];
-        }
-        return nextUrl || null;
-      } else {
-        return null;
-      }
-    }
-  );
-
-export const makeSelectNextUrlForCollectionAndUrl = (id: string, url: string) =>
-  createSelector(
-    state => state.content.shuffleList,
-    state => state.content.loopList,
-    makeSelectIndexForUrlInCollection(url, id),
-    makeSelectUrlsForCollectionId(id),
-    (shuffleState, loopState, index, urls) => {
-      const loopList = loopState && loopState.collectionId === id && loopState.loop;
-      const shuffleUrls = shuffleState && shuffleState.collectionId === id && shuffleState.newUrls;
-
-      if (index > -1) {
-        const listUrls = shuffleUrls || urls;
-        // We'll get the next playble url
-        let remainingUrls = listUrls.slice(index + 1);
-        if (!remainingUrls.length && loopList) {
-          remainingUrls = listUrls.slice(0);
-        }
-        const nextUrl = remainingUrls && remainingUrls[0];
-        return nextUrl || null;
-      } else {
-        return null;
-      }
-    }
-  );
-
-export const makeSelectNameForCollectionId = (id: string) =>
-  createSelector(
-    makeSelectCollectionForId(id),
-    collection => {
-      return (collection && collection.name) || '';
-    }
-  );
-
-export const makeSelectCountForCollectionId = (id: string) =>
-  createSelector(
-    makeSelectCollectionForId(id),
-    collection => {
-      if (collection) {
-        if (collection.itemCount !== undefined) {
-          return collection.itemCount;
-        }
-        let itemCount = 0;
-        collection.items.map(item => {
-          if (item) {
-            itemCount += 1;
-          }
-        });
-        return itemCount;
-      }
-      return null;
-    }
-  );
diff --git a/src/redux/selectors/publish.js b/src/redux/selectors/publish.js
index a3a44a2..10ed95b 100644
--- a/src/redux/selectors/publish.js
+++ b/src/redux/selectors/publish.js
@@ -40,22 +40,17 @@ export const selectIsStillEditing = createSelector(
 
 export const selectPublishFormValues = createSelector(
   selectState,
-  state => state.settings,
   selectIsStillEditing,
-  (publishState, settingsState, isStillEditing) => {
-    const { languages, ...formValues } = publishState;
-    const language = languages && languages.length && languages[0];
-    const { clientSettings } = settingsState;
-    const { language: languageSet } = clientSettings;
+  (state, isStillEditing) => {
+    const { pendingPublish, language, languages, ...formValues } = state;
 
     let actualLanguage;
     // Sets default if editing a claim with a set language
-    if (!language && isStillEditing && languageSet) {
-      actualLanguage = languageSet;
+    if (!language && isStillEditing && languages && languages[0]) {
+      actualLanguage = languages[0];
     } else {
-      actualLanguage = language || languageSet || 'en';
+      actualLanguage = language || 'en';
     }
-
     return { ...formValues, language: actualLanguage };
   }
 );
diff --git a/src/redux/selectors/tags.js b/src/redux/selectors/tags.js
new file mode 100644
index 0000000..17f3fd8
--- /dev/null
+++ b/src/redux/selectors/tags.js
@@ -0,0 +1,47 @@
+// @flow
+import { createSelector } from 'reselect';
+
+const selectState = (state: { tags: TagState }) => state.tags || {};
+
+export const selectKnownTagsByName = createSelector(
+  selectState,
+  (state: TagState): KnownTags => state.knownTags
+);
+
+export const selectFollowedTagsList = createSelector(
+  selectState,
+  (state: TagState): Array<string> => state.followedTags.filter(tag => typeof tag === 'string')
+);
+
+export const selectFollowedTags = createSelector(
+  selectFollowedTagsList,
+  (followedTags: Array<string>): Array<Tag> =>
+    followedTags
+      .map(tag => ({ name: tag.toLowerCase() }))
+      .sort((a, b) => a.name.localeCompare(b.name))
+);
+
+export const selectUnfollowedTags = createSelector(
+  selectKnownTagsByName,
+  selectFollowedTagsList,
+  (tagsByName: KnownTags, followedTags: Array<string>): Array<Tag> => {
+    const followedTagsSet = new Set(followedTags);
+    let tagsToReturn = [];
+    Object.keys(tagsByName).forEach(key => {
+      if (!followedTagsSet.has(key)) {
+        const { name } = tagsByName[key];
+        tagsToReturn.push({ name: name.toLowerCase() });
+      }
+    });
+
+    return tagsToReturn;
+  }
+);
+
+export const makeSelectIsFollowingTag = (tag: string) =>
+  createSelector(
+    selectFollowedTags,
+    followedTags => {
+      return followedTags.some(followedTag => followedTag.name === tag.toLowerCase());
+    }
+  );
diff --git a/src/redux/selectors/wallet.js b/src/redux/selectors/wallet.js
index 0eb5316..6765f59 100644
--- a/src/redux/selectors/wallet.js
+++ b/src/redux/selectors/wallet.js
@@ -2,7 +2,6 @@ import { createSelector } from 'reselect';
 import * as TRANSACTIONS from 'constants/transaction_types';
 import { PAGE_SIZE, LATEST_PAGE_SIZE } from 'constants/transaction_list';
 import { selectClaimIdsByUri } from 'redux/selectors/claims';
-import parseData from 'util/parse-data';
 export const selectState = state => state.wallet || {};
 
 export const selectWalletState = selectState;
@@ -27,27 +26,21 @@ export const selectPendingSupportTransactions = createSelector(
   state => state.pendingSupportTransactions
 );
 
-export const selectPendingOtherTransactions = createSelector(
-  selectState,
-  state => state.pendingTxos
-);
-
 export const selectAbandonClaimSupportError = createSelector(
   selectState,
   state => state.abandonClaimSupportError
 );
 
-export const makeSelectPendingAmountByUri = uri =>
-  createSelector(
-    selectClaimIdsByUri,
-    selectPendingSupportTransactions,
-    (claimIdsByUri, pendingSupports) => {
-      const uriEntry = Object.entries(claimIdsByUri).find(([u, cid]) => u === uri);
-      const claimId = uriEntry && uriEntry[1];
-      const pendingSupport = claimId && pendingSupports[claimId];
-      return pendingSupport ? pendingSupport.effective : undefined;
-    }
-  );
+export const makeSelectPendingAmountByUri = (uri) => createSelector(
+  selectClaimIdsByUri,
+  selectPendingSupportTransactions,
+  (claimIdsByUri, pendingSupports) => {
+    const uriEntry = Object.entries(claimIdsByUri).find(([u, cid]) => u === uri);
+    const claimId = uriEntry && uriEntry[1];
+    const pendingSupport = claimId && pendingSupports[claimId];
+    return pendingSupport ? pendingSupport.effective : undefined;
+  }
+);
 
 export const selectWalletEncryptResult = createSelector(
   selectState,
@@ -268,27 +261,6 @@ export const selectIsFetchingTransactions = createSelector(
   state => state.fetchingTransactions
 );
 
-/**
- * CSV of 'selectTransactionItems'.
- */
-export const selectTransactionsFile = createSelector(
-  selectTransactionItems,
-  transactions => {
-    if (!transactions || transactions.length === 0) {
-      // No data.
-      return undefined;
-    }
-
-    const parsed = parseData(transactions, 'csv');
-    if (!parsed) {
-      // Invalid data, or failed to parse.
-      return null;
-    }
-
-    return parsed;
-  }
-);
-
 export const selectIsSendingSupport = createSelector(
   selectState,
   state => state.sendingSupport
@@ -356,27 +328,27 @@ export const selectTxoPageParams = createSelector(
 
 export const selectTxoPage = createSelector(
   selectState,
-  state => (state.txoPage && state.txoPage.items) || []
+  state => (state.txoPage && state.txoPage.items) || [],
 );
 
 export const selectTxoPageNumber = createSelector(
   selectState,
-  state => (state.txoPage && state.txoPage.page) || 1
+  state => (state.txoPage && state.txoPage.page) || 1,
 );
 
 export const selectTxoItemCount = createSelector(
   selectState,
-  state => (state.txoPage && state.txoPage.total_items) || 1
+  state => (state.txoPage && state.txoPage.total_items) || 1,
 );
 
 export const selectFetchingTxosError = createSelector(
   selectState,
-  state => state.fetchingTxosError
+  state => state.fetchingTxosError,
 );
 
 export const selectIsFetchingTxos = createSelector(
   selectState,
-  state => state.fetchingTxos
+  state => state.fetchingTxos,
 );
 
 export const makeSelectFilteredTransactionsForPage = (page = 1) =>
@@ -407,33 +379,3 @@ export const selectIsWalletReconnecting = createSelector(
   selectState,
   state => state.walletReconnecting
 );
-
-export const selectIsFetchingUtxoCounts = createSelector(
-  selectState,
-  state => state.fetchingUtxoCounts
-);
-
-export const selectIsConsolidatingUtxos = createSelector(
-  selectState,
-  state => state.consolidatingUtxos
-);
-
-export const selectIsMassClaimingTips = createSelector(
-  selectState,
-  state => state.massClaimingTips
-);
-
-export const selectPendingConsolidateTxid = createSelector(
-  selectState,
-  state => state.pendingConsolidateTxid
-);
-
-export const selectPendingMassClaimTxid = createSelector(
-  selectState,
-  state => state.pendingMassClaimTxid
-);
-
-export const selectUtxoCounts = createSelector(
-  selectState,
-  state => state.utxoCounts
-);
diff --git a/src/util/parse-data.js b/src/util/parse-data.js
deleted file mode 100644
index 83f9a1c..0000000
--- a/src/util/parse-data.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// JSON parser
-const parseJson = (data, filters = []) => {
-  const list = data.map(item => {
-    const temp = {};
-    // Apply filters
-    Object.entries(item).forEach(([key, value]) => {
-      if (!filters.includes(key)) temp[key] = value;
-    });
-    return temp;
-  });
-  // Beautify JSON
-  return JSON.stringify(list, null, '\t');
-};
-
-// CSV Parser
-// No need for an external module:
-// https://gist.github.com/btzr-io/55c3450ea3d709fc57540e762899fb85
-const parseCsv = (data, filters = []) => {
-  // Get items for header
-  const getHeaders = item => {
-    const list = [];
-    // Apply filters
-    Object.entries(item).forEach(([key]) => {
-      if (!filters.includes(key)) list.push(key);
-    });
-    // return headers
-    return list.join(',');
-  };
-
-  // Get rows content
-  const getData = list =>
-    list
-      .map(item => {
-        const row = [];
-        // Apply filters
-        Object.entries(item).forEach(([key, value]) => {
-          if (!filters.includes(key)) row.push(value);
-        });
-        // return rows
-        return row.join(',');
-      })
-      .join('\n');
-
-  // Return CSV string
-  return `${getHeaders(data[0])} \n ${getData(data)}`;
-};
-
-const parseData = (data, format, filters = []) => {
-  // Check for validation
-  const valid = data && data[0] && format;
-  // Pick a format
-  const formats = {
-    csv: list => parseCsv(list, filters),
-    json: list => parseJson(list, filters),
-  };
-
-  // Return parsed data: JSON || CSV
-  return valid && formats[format] ? formats[format](data) : undefined;
-};
-
-export default parseData;
diff --git a/tests/config/jest-transformer.js b/tests/config/jest-transformer.js
deleted file mode 100644
index 79e8020..0000000
--- a/tests/config/jest-transformer.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const config = {
-  babelrc: false,
-  presets: [
-    [
-      "@babel/env",
-      {
-        modules: false
-      }
-    ],
-    "@babel/react"
-  ],
-  plugins: [
-    ["@babel/plugin-proposal-decorators", { legacy: true }],
-    ["@babel/plugin-proposal-class-properties", { loose: true }],
-    "@babel/plugin-transform-flow-strip-types",
-    "transform-es2015-modules-commonjs"
-  ]
-};
-module.exports = require("babel-jest").createTransformer(config);
diff --git a/tests/parseURI.test.js b/tests/parseURI.test.js
deleted file mode 100644
index 4b06ae4..0000000
--- a/tests/parseURI.test.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as lbryURI from '../src/lbryURI.js';
-import {describe, test} from "@jest/globals";
-
-describe('parseURI tests', () => {
-
-    test('Correctly parses channel URI', () => {
-        let result = lbryURI.parseURI('lbry://@ChannelName');
-        expect(result.isChannel).toBeTruthy();
-        expect(result.path).toStrictEqual("@ChannelName");
-        expect(result.channelName).toStrictEqual("ChannelName");
-        expect(result.claimName).toStrictEqual("@ChannelName");
-    });
-
-    test('Correctly parses test case channel/stream lbry URI', () => {
-        let result = lbryURI.parseURI('lbry://@CryptoGnome#1/whale-pool-how-to#e');
-        expect(result.isChannel).toStrictEqual(false);;
-        expect(result.path).toStrictEqual("@CryptoGnome#1/whale-pool-how-to#e");
-        expect(result.claimId).toStrictEqual("1");
-        expect(result.streamClaimId).toStrictEqual("e");
-        expect(result.streamName).toStrictEqual("whale-pool-how-to");
-        expect(result.channelName).toStrictEqual("CryptoGnome");
-        expect(result.contentName).toStrictEqual("whale-pool-how-to");
-    });
-
-    test('Correctly parses lbry URI without protocol', () => {
-        let result = lbryURI.parseURI('@CryptoGnome#1/whale-pool-how-to#e');
-        expect(result.isChannel).toStrictEqual(false);;
-        expect(result.streamName).toStrictEqual("whale-pool-how-to");
-        expect(result.channelName).toStrictEqual("CryptoGnome");
-    });
-
-    test('Throws error for http protocol', () => {
-        // TODO - this catches wrong type of error..
-        let uri = 'http://@CryptoGnome#1/whale-pool-how-to#e';
-        expect(() => lbryURI.parseURI(uri)).toThrowError();
-    });
-
-    test('Correctly parses search', () => {
-        let result = lbryURI.parseURI('CryptoGn%ome');
-        expect(result.isChannel).toStrictEqual(false);
-        expect(result.path).toStrictEqual("CryptoGn%ome");
-        expect(result.contentName).toStrictEqual("CryptoGn%ome");
-    });
-})
diff --git a/yarn.lock b/yarn.lock
index af93714..d0ab3dc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -23,44 +23,6 @@
   dependencies:
     "@babel/highlight" "7.0.0-beta.46"
 
-"@babel/code-frame@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
-  integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
-  dependencies:
-    "@babel/highlight" "^7.10.4"
-
-"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
-  integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==
-  dependencies:
-    browserslist "^4.12.0"
-    invariant "^2.2.4"
-    semver "^5.5.0"
-
-"@babel/core@^7.1.0", "@babel/core@^7.7.5":
-  version "7.11.6"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651"
-  integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/generator" "^7.11.6"
-    "@babel/helper-module-transforms" "^7.11.0"
-    "@babel/helpers" "^7.10.4"
-    "@babel/parser" "^7.11.5"
-    "@babel/template" "^7.10.4"
-    "@babel/traverse" "^7.11.5"
-    "@babel/types" "^7.11.5"
-    convert-source-map "^1.7.0"
-    debug "^4.1.0"
-    gensync "^1.0.0-beta.1"
-    json5 "^2.1.2"
-    lodash "^4.17.19"
-    resolve "^1.3.2"
-    semver "^5.4.1"
-    source-map "^0.5.0"
-
 "@babel/generator@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42"
@@ -72,95 +34,6 @@
     source-map "^0.5.0"
     trim-right "^1.0.1"
 
-"@babel/generator@^7.11.5", "@babel/generator@^7.11.6":
-  version "7.11.6"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
-  integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
-  dependencies:
-    "@babel/types" "^7.11.5"
-    jsesc "^2.5.1"
-    source-map "^0.5.0"
-
-"@babel/helper-annotate-as-pure@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
-  integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==
-  dependencies:
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
-  integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==
-  dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-builder-react-jsx-experimental@^7.10.4", "@babel/helper-builder-react-jsx-experimental@^7.11.5":
-  version "7.11.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f"
-  integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/helper-module-imports" "^7.10.4"
-    "@babel/types" "^7.11.5"
-
-"@babel/helper-builder-react-jsx@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d"
-  integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-compilation-targets@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2"
-  integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==
-  dependencies:
-    "@babel/compat-data" "^7.10.4"
-    browserslist "^4.12.0"
-    invariant "^2.2.4"
-    levenary "^1.1.1"
-    semver "^5.5.0"
-
-"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
-  integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/helper-member-expression-to-functions" "^7.10.5"
-    "@babel/helper-optimise-call-expression" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-replace-supers" "^7.10.4"
-    "@babel/helper-split-export-declaration" "^7.10.4"
-
-"@babel/helper-create-regexp-features-plugin@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
-  integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/helper-regex" "^7.10.4"
-    regexpu-core "^4.7.0"
-
-"@babel/helper-define-map@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
-  integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/types" "^7.10.5"
-    lodash "^4.17.19"
-
-"@babel/helper-explode-assignable-expression@^7.10.4":
-  version "7.11.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b"
-  integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==
-  dependencies:
-    "@babel/types" "^7.10.4"
-
 "@babel/helper-function-name@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd"
@@ -170,15 +43,6 @@
     "@babel/template" "7.0.0-beta.44"
     "@babel/types" "7.0.0-beta.44"
 
-"@babel/helper-function-name@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
-  integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
-  dependencies:
-    "@babel/helper-get-function-arity" "^7.10.4"
-    "@babel/template" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
 "@babel/helper-get-function-arity@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15"
@@ -186,101 +50,6 @@
   dependencies:
     "@babel/types" "7.0.0-beta.44"
 
-"@babel/helper-get-function-arity@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
-  integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
-  dependencies:
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-hoist-variables@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
-  integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==
-  dependencies:
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
-  integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
-  dependencies:
-    "@babel/types" "^7.11.0"
-
-"@babel/helper-module-imports@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
-  integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
-  dependencies:
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
-  integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
-  dependencies:
-    "@babel/helper-module-imports" "^7.10.4"
-    "@babel/helper-replace-supers" "^7.10.4"
-    "@babel/helper-simple-access" "^7.10.4"
-    "@babel/helper-split-export-declaration" "^7.11.0"
-    "@babel/template" "^7.10.4"
-    "@babel/types" "^7.11.0"
-    lodash "^4.17.19"
-
-"@babel/helper-optimise-call-expression@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
-  integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
-  dependencies:
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
-  integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
-
-"@babel/helper-regex@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
-  integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==
-  dependencies:
-    lodash "^4.17.19"
-
-"@babel/helper-remap-async-to-generator@^7.10.4":
-  version "7.11.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d"
-  integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/helper-wrap-function" "^7.10.4"
-    "@babel/template" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-replace-supers@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
-  integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
-  dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.10.4"
-    "@babel/helper-optimise-call-expression" "^7.10.4"
-    "@babel/traverse" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-simple-access@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
-  integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
-  dependencies:
-    "@babel/template" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
-  integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==
-  dependencies:
-    "@babel/types" "^7.11.0"
-
 "@babel/helper-split-export-declaration@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc"
@@ -288,37 +57,6 @@
   dependencies:
     "@babel/types" "7.0.0-beta.44"
 
-"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
-  integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
-  dependencies:
-    "@babel/types" "^7.11.0"
-
-"@babel/helper-validator-identifier@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
-  integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
-
-"@babel/helper-wrap-function@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
-  integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/template" "^7.10.4"
-    "@babel/traverse" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
-"@babel/helpers@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
-  integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
-  dependencies:
-    "@babel/template" "^7.10.4"
-    "@babel/traverse" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
 "@babel/highlight@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5"
@@ -346,669 +84,6 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/highlight@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
-  integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
-  dependencies:
-    "@babel/helper-validator-identifier" "^7.10.4"
-    chalk "^2.0.0"
-    js-tokens "^4.0.0"
-
-"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5":
-  version "7.11.5"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
-  integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
-
-"@babel/plugin-proposal-async-generator-functions@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558"
-  integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-remap-async-to-generator" "^7.10.4"
-    "@babel/plugin-syntax-async-generators" "^7.8.0"
-
-"@babel/plugin-proposal-class-properties@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
-  integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-proposal-decorators@^7.10.5":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4"
-  integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.10.5"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-decorators" "^7.10.4"
-
-"@babel/plugin-proposal-dynamic-import@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
-  integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
-
-"@babel/plugin-proposal-export-namespace-from@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
-  integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-proposal-json-strings@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db"
-  integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-json-strings" "^7.8.0"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8"
-  integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a"
-  integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-
-"@babel/plugin-proposal-numeric-separator@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06"
-  integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
-"@babel/plugin-proposal-object-rest-spread@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af"
-  integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
-    "@babel/plugin-transform-parameters" "^7.10.4"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
-  integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-
-"@babel/plugin-proposal-optional-chaining@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076"
-  integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
-    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-
-"@babel/plugin-proposal-private-methods@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
-  integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d"
-  integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4":
-  version "7.8.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
-  integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-bigint@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
-  integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c"
-  integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-decorators@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c"
-  integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-dynamic-import@^7.8.0":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
-  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
-  integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-syntax-flow@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6"
-  integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-import-meta@^7.8.3":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
-  integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
-  integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-jsx@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c"
-  integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
-  integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
-  integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
-  integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
-  integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
-  integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
-  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-top-level-await@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d"
-  integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-arrow-functions@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd"
-  integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-async-to-generator@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37"
-  integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==
-  dependencies:
-    "@babel/helper-module-imports" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-remap-async-to-generator" "^7.10.4"
-
-"@babel/plugin-transform-block-scoped-functions@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8"
-  integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-block-scoping@^7.10.4":
-  version "7.11.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215"
-  integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-classes@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7"
-  integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/helper-define-map" "^7.10.4"
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/helper-optimise-call-expression" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-replace-supers" "^7.10.4"
-    "@babel/helper-split-export-declaration" "^7.10.4"
-    globals "^11.1.0"
-
-"@babel/plugin-transform-computed-properties@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb"
-  integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-destructuring@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5"
-  integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee"
-  integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-duplicate-keys@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47"
-  integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-exponentiation-operator@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e"
-  integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==
-  dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-flow-strip-types@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788"
-  integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-flow" "^7.10.4"
-
-"@babel/plugin-transform-for-of@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9"
-  integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-function-name@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7"
-  integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-literals@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c"
-  integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-member-expression-literals@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7"
-  integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-modules-amd@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
-  integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
-  dependencies:
-    "@babel/helper-module-transforms" "^7.10.5"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    babel-plugin-dynamic-import-node "^2.3.3"
-
-"@babel/plugin-transform-modules-commonjs@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
-  integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==
-  dependencies:
-    "@babel/helper-module-transforms" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-simple-access" "^7.10.4"
-    babel-plugin-dynamic-import-node "^2.3.3"
-
-"@babel/plugin-transform-modules-systemjs@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
-  integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==
-  dependencies:
-    "@babel/helper-hoist-variables" "^7.10.4"
-    "@babel/helper-module-transforms" "^7.10.5"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    babel-plugin-dynamic-import-node "^2.3.3"
-
-"@babel/plugin-transform-modules-umd@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e"
-  integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==
-  dependencies:
-    "@babel/helper-module-transforms" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6"
-  integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
-
-"@babel/plugin-transform-new-target@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
-  integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-object-super@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
-  integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-replace-supers" "^7.10.4"
-
-"@babel/plugin-transform-parameters@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
-  integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==
-  dependencies:
-    "@babel/helper-get-function-arity" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-property-literals@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0"
-  integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-react-display-name@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d"
-  integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-react-jsx-development@^7.10.4":
-  version "7.11.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz#e1439e6a57ee3d43e9f54ace363fb29cefe5d7b6"
-  integrity sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==
-  dependencies:
-    "@babel/helper-builder-react-jsx-experimental" "^7.11.5"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-jsx" "^7.10.4"
-
-"@babel/plugin-transform-react-jsx-self@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369"
-  integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-jsx" "^7.10.4"
-
-"@babel/plugin-transform-react-jsx-source@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4"
-  integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-jsx" "^7.10.4"
-
-"@babel/plugin-transform-react-jsx@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2"
-  integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==
-  dependencies:
-    "@babel/helper-builder-react-jsx" "^7.10.4"
-    "@babel/helper-builder-react-jsx-experimental" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-syntax-jsx" "^7.10.4"
-
-"@babel/plugin-transform-react-pure-annotations@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501"
-  integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-regenerator@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63"
-  integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==
-  dependencies:
-    regenerator-transform "^0.14.2"
-
-"@babel/plugin-transform-reserved-words@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd"
-  integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-shorthand-properties@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
-  integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-spread@^7.11.0":
-  version "7.11.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc"
-  integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
-
-"@babel/plugin-transform-sticky-regex@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
-  integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/helper-regex" "^7.10.4"
-
-"@babel/plugin-transform-template-literals@^7.10.4":
-  version "7.10.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
-  integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-typeof-symbol@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc"
-  integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-unicode-escapes@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007"
-  integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-transform-unicode-regex@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8"
-  integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/preset-env@^7.11.0":
-  version "7.11.5"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272"
-  integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==
-  dependencies:
-    "@babel/compat-data" "^7.11.0"
-    "@babel/helper-compilation-targets" "^7.10.4"
-    "@babel/helper-module-imports" "^7.10.4"
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-proposal-async-generator-functions" "^7.10.4"
-    "@babel/plugin-proposal-class-properties" "^7.10.4"
-    "@babel/plugin-proposal-dynamic-import" "^7.10.4"
-    "@babel/plugin-proposal-export-namespace-from" "^7.10.4"
-    "@babel/plugin-proposal-json-strings" "^7.10.4"
-    "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
-    "@babel/plugin-proposal-numeric-separator" "^7.10.4"
-    "@babel/plugin-proposal-object-rest-spread" "^7.11.0"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
-    "@babel/plugin-proposal-optional-chaining" "^7.11.0"
-    "@babel/plugin-proposal-private-methods" "^7.10.4"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
-    "@babel/plugin-syntax-async-generators" "^7.8.0"
-    "@babel/plugin-syntax-class-properties" "^7.10.4"
-    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
-    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-    "@babel/plugin-syntax-json-strings" "^7.8.0"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-    "@babel/plugin-syntax-top-level-await" "^7.10.4"
-    "@babel/plugin-transform-arrow-functions" "^7.10.4"
-    "@babel/plugin-transform-async-to-generator" "^7.10.4"
-    "@babel/plugin-transform-block-scoped-functions" "^7.10.4"
-    "@babel/plugin-transform-block-scoping" "^7.10.4"
-    "@babel/plugin-transform-classes" "^7.10.4"
-    "@babel/plugin-transform-computed-properties" "^7.10.4"
-    "@babel/plugin-transform-destructuring" "^7.10.4"
-    "@babel/plugin-transform-dotall-regex" "^7.10.4"
-    "@babel/plugin-transform-duplicate-keys" "^7.10.4"
-    "@babel/plugin-transform-exponentiation-operator" "^7.10.4"
-    "@babel/plugin-transform-for-of" "^7.10.4"
-    "@babel/plugin-transform-function-name" "^7.10.4"
-    "@babel/plugin-transform-literals" "^7.10.4"
-    "@babel/plugin-transform-member-expression-literals" "^7.10.4"
-    "@babel/plugin-transform-modules-amd" "^7.10.4"
-    "@babel/plugin-transform-modules-commonjs" "^7.10.4"
-    "@babel/plugin-transform-modules-systemjs" "^7.10.4"
-    "@babel/plugin-transform-modules-umd" "^7.10.4"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
-    "@babel/plugin-transform-new-target" "^7.10.4"
-    "@babel/plugin-transform-object-super" "^7.10.4"
-    "@babel/plugin-transform-parameters" "^7.10.4"
-    "@babel/plugin-transform-property-literals" "^7.10.4"
-    "@babel/plugin-transform-regenerator" "^7.10.4"
-    "@babel/plugin-transform-reserved-words" "^7.10.4"
-    "@babel/plugin-transform-shorthand-properties" "^7.10.4"
-    "@babel/plugin-transform-spread" "^7.11.0"
-    "@babel/plugin-transform-sticky-regex" "^7.10.4"
-    "@babel/plugin-transform-template-literals" "^7.10.4"
-    "@babel/plugin-transform-typeof-symbol" "^7.10.4"
-    "@babel/plugin-transform-unicode-escapes" "^7.10.4"
-    "@babel/plugin-transform-unicode-regex" "^7.10.4"
-    "@babel/preset-modules" "^0.1.3"
-    "@babel/types" "^7.11.5"
-    browserslist "^4.12.0"
-    core-js-compat "^3.6.2"
-    invariant "^2.2.2"
-    levenary "^1.1.1"
-    semver "^5.5.0"
-
-"@babel/preset-modules@^0.1.3":
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
-  integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
-    "@babel/plugin-transform-dotall-regex" "^7.4.4"
-    "@babel/types" "^7.4.4"
-    esutils "^2.0.2"
-
-"@babel/preset-react@^7.10.4":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf"
-  integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.4"
-    "@babel/plugin-transform-react-display-name" "^7.10.4"
-    "@babel/plugin-transform-react-jsx" "^7.10.4"
-    "@babel/plugin-transform-react-jsx-development" "^7.10.4"
-    "@babel/plugin-transform-react-jsx-self" "^7.10.4"
-    "@babel/plugin-transform-react-jsx-source" "^7.10.4"
-    "@babel/plugin-transform-react-pure-annotations" "^7.10.4"
-
-"@babel/runtime@^7.8.4":
-  version "7.11.2"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
-  integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
-  dependencies:
-    regenerator-runtime "^0.13.4"
-
 "@babel/template@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f"
@@ -1019,15 +94,6 @@
     babylon "7.0.0-beta.44"
     lodash "^4.2.0"
 
-"@babel/template@^7.10.4", "@babel/template@^7.3.3":
-  version "7.10.4"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
-  integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/parser" "^7.10.4"
-    "@babel/types" "^7.10.4"
-
 "@babel/traverse@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966"
@@ -1044,21 +110,6 @@
     invariant "^2.2.0"
     lodash "^4.2.0"
 
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
-  version "7.11.5"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
-  integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/generator" "^7.11.5"
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/helper-split-export-declaration" "^7.11.0"
-    "@babel/parser" "^7.11.5"
-    "@babel/types" "^7.11.5"
-    debug "^4.1.0"
-    globals "^11.1.0"
-    lodash "^4.17.19"
-
 "@babel/types@7.0.0-beta.44":
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757"
@@ -1068,215 +119,6 @@
     lodash "^4.2.0"
     to-fast-properties "^2.0.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
-  version "7.11.5"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
-  integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
-  dependencies:
-    "@babel/helper-validator-identifier" "^7.10.4"
-    lodash "^4.17.19"
-    to-fast-properties "^2.0.0"
-
-"@bcoe/v8-coverage@^0.2.3":
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
-  integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-
-"@cnakazawa/watch@^1.0.3":
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
-  integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
-  dependencies:
-    exec-sh "^0.3.2"
-    minimist "^1.2.0"
-
-"@istanbuljs/load-nyc-config@^1.0.0":
-  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"
-
-"@istanbuljs/schema@^0.1.2":
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd"
-  integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
-
-"@jest/console@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.3.0.tgz#ed04063efb280c88ba87388b6f16427c0a85c856"
-  integrity sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    chalk "^4.0.0"
-    jest-message-util "^26.3.0"
-    jest-util "^26.3.0"
-    slash "^3.0.0"
-
-"@jest/core@^26.4.2":
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.4.2.tgz#85d0894f31ac29b5bab07aa86806d03dd3d33edc"
-  integrity sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==
-  dependencies:
-    "@jest/console" "^26.3.0"
-    "@jest/reporters" "^26.4.1"
-    "@jest/test-result" "^26.3.0"
-    "@jest/transform" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    ansi-escapes "^4.2.1"
-    chalk "^4.0.0"
-    exit "^0.1.2"
-    graceful-fs "^4.2.4"
-    jest-changed-files "^26.3.0"
-    jest-config "^26.4.2"
-    jest-haste-map "^26.3.0"
-    jest-message-util "^26.3.0"
-    jest-regex-util "^26.0.0"
-    jest-resolve "^26.4.0"
-    jest-resolve-dependencies "^26.4.2"
-    jest-runner "^26.4.2"
-    jest-runtime "^26.4.2"
-    jest-snapshot "^26.4.2"
-    jest-util "^26.3.0"
-    jest-validate "^26.4.2"
-    jest-watcher "^26.3.0"
-    micromatch "^4.0.2"
-    p-each-series "^2.1.0"
-    rimraf "^3.0.0"
-    slash "^3.0.0"
-    strip-ansi "^6.0.0"
-
-"@jest/environment@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.3.0.tgz#e6953ab711ae3e44754a025f838bde1a7fd236a0"
-  integrity sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==
-  dependencies:
-    "@jest/fake-timers" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    jest-mock "^26.3.0"
-
-"@jest/fake-timers@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.3.0.tgz#f515d4667a6770f60ae06ae050f4e001126c666a"
-  integrity sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    "@sinonjs/fake-timers" "^6.0.1"
-    "@types/node" "*"
-    jest-message-util "^26.3.0"
-    jest-mock "^26.3.0"
-    jest-util "^26.3.0"
-
-"@jest/globals@^26.4.2":
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.4.2.tgz#73c2a862ac691d998889a241beb3dc9cada40d4a"
-  integrity sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==
-  dependencies:
-    "@jest/environment" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    expect "^26.4.2"
-
-"@jest/reporters@^26.4.1":
-  version "26.4.1"
-  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.4.1.tgz#3b4d6faf28650f3965f8b97bc3d114077fb71795"
-  integrity sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==
-  dependencies:
-    "@bcoe/v8-coverage" "^0.2.3"
-    "@jest/console" "^26.3.0"
-    "@jest/test-result" "^26.3.0"
-    "@jest/transform" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    chalk "^4.0.0"
-    collect-v8-coverage "^1.0.0"
-    exit "^0.1.2"
-    glob "^7.1.2"
-    graceful-fs "^4.2.4"
-    istanbul-lib-coverage "^3.0.0"
-    istanbul-lib-instrument "^4.0.3"
-    istanbul-lib-report "^3.0.0"
-    istanbul-lib-source-maps "^4.0.0"
-    istanbul-reports "^3.0.2"
-    jest-haste-map "^26.3.0"
-    jest-resolve "^26.4.0"
-    jest-util "^26.3.0"
-    jest-worker "^26.3.0"
-    slash "^3.0.0"
-    source-map "^0.6.0"
-    string-length "^4.0.1"
-    terminal-link "^2.0.0"
-    v8-to-istanbul "^5.0.1"
-  optionalDependencies:
-    node-notifier "^8.0.0"
-
-"@jest/source-map@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.3.0.tgz#0e646e519883c14c551f7b5ae4ff5f1bfe4fc3d9"
-  integrity sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==
-  dependencies:
-    callsites "^3.0.0"
-    graceful-fs "^4.2.4"
-    source-map "^0.6.0"
-
-"@jest/test-result@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.3.0.tgz#46cde01fa10c0aaeb7431bf71e4a20d885bc7fdb"
-  integrity sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==
-  dependencies:
-    "@jest/console" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/istanbul-lib-coverage" "^2.0.0"
-    collect-v8-coverage "^1.0.0"
-
-"@jest/test-sequencer@^26.4.2":
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz#58a3760a61eec758a2ce6080201424580d97cbba"
-  integrity sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==
-  dependencies:
-    "@jest/test-result" "^26.3.0"
-    graceful-fs "^4.2.4"
-    jest-haste-map "^26.3.0"
-    jest-runner "^26.4.2"
-    jest-runtime "^26.4.2"
-
-"@jest/transform@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.3.0.tgz#c393e0e01459da8a8bfc6d2a7c2ece1a13e8ba55"
-  integrity sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==
-  dependencies:
-    "@babel/core" "^7.1.0"
-    "@jest/types" "^26.3.0"
-    babel-plugin-istanbul "^6.0.0"
-    chalk "^4.0.0"
-    convert-source-map "^1.4.0"
-    fast-json-stable-stringify "^2.0.0"
-    graceful-fs "^4.2.4"
-    jest-haste-map "^26.3.0"
-    jest-regex-util "^26.0.0"
-    jest-util "^26.3.0"
-    micromatch "^4.0.2"
-    pirates "^4.0.1"
-    slash "^3.0.0"
-    source-map "^0.6.1"
-    write-file-atomic "^3.0.0"
-
-"@jest/types@^26.3.0":
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.3.0.tgz#97627bf4bdb72c55346eef98e3b3f7ddc4941f71"
-  integrity sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==
-  dependencies:
-    "@types/istanbul-lib-coverage" "^2.0.0"
-    "@types/istanbul-reports" "^3.0.0"
-    "@types/node" "*"
-    "@types/yargs" "^15.0.0"
-    chalk "^4.0.0"
-
 "@octokit/rest@^15.2.6":
   version "15.9.4"
   resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.9.4.tgz#c6cf0f483275d9c798b18419b7c9d417493bb70f"
@@ -1291,141 +133,21 @@
     node-fetch "^2.1.1"
     url-template "^2.0.8"
 
-"@sinonjs/commons@^1.7.0":
-  version "1.8.1"
-  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217"
-  integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==
-  dependencies:
-    type-detect "4.0.8"
-
-"@sinonjs/fake-timers@^6.0.1":
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
-  integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
-  dependencies:
-    "@sinonjs/commons" "^1.7.0"
-
-"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7":
-  version "7.1.10"
-  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40"
-  integrity sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==
-  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.2"
-  resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8"
-  integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==
-  dependencies:
-    "@babel/types" "^7.0.0"
-
-"@types/babel__template@*":
-  version "7.0.3"
-  resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214"
-  integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==
-  dependencies:
-    "@babel/parser" "^7.1.0"
-    "@babel/types" "^7.0.0"
-
-"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
-  version "7.0.15"
-  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03"
-  integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==
-  dependencies:
-    "@babel/types" "^7.3.0"
-
-"@types/color-name@^1.1.1":
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
-  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
-
 "@types/estree@0.0.39":
   version "0.0.39"
   resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
   integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
 
-"@types/graceful-fs@^4.1.2":
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f"
-  integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==
-  dependencies:
-    "@types/node" "*"
-
-"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
-  integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==
-
-"@types/istanbul-lib-report@*":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
-  integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
-  dependencies:
-    "@types/istanbul-lib-coverage" "*"
-
-"@types/istanbul-reports@^3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821"
-  integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==
-  dependencies:
-    "@types/istanbul-lib-report" "*"
-
-"@types/node@*":
-  version "14.11.2"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
-  integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==
-
 "@types/node@^11.11.6":
   version "11.13.0"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.0.tgz#b0df8d6ef9b5001b2be3a94d909ce3c29a80f9e1"
   integrity sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng==
 
-"@types/normalize-package-data@^2.4.0":
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
-  integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
-
-"@types/prettier@^2.0.0":
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.1.tgz#be148756d5480a84cde100324c03a86ae5739fb5"
-  integrity sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ==
-
-"@types/stack-utils@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
-  integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
-
-"@types/yargs-parser@*":
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
-  integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
-
-"@types/yargs@^15.0.0":
-  version "15.0.7"
-  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.7.tgz#dad50a7a234a35ef9460737a56024287a3de1d2b"
-  integrity sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA==
-  dependencies:
-    "@types/yargs-parser" "*"
-
-"@ungap/from-entries@^0.2.1":
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/@ungap/from-entries/-/from-entries-0.2.1.tgz#7e86196b8b2e99d73106a8f25c2a068326346354"
-  integrity sha512-CAqefTFAfnUPwYqsWHXpOxHaq1Zo5UQ3m9Zm2p09LggGe57rqHoBn3c++xcoomzXKynAUuiBMDUCQvKMnXjUpA==
-
 abab@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
   integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=
 
-abab@^2.0.3:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
-  integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
-
 acorn-globals@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
@@ -1433,24 +155,11 @@ acorn-globals@^4.1.0:
   dependencies:
     acorn "^5.0.0"
 
-acorn-globals@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
-  integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
-  dependencies:
-    acorn "^7.1.1"
-    acorn-walk "^7.1.1"
-
 acorn-jsx@^5.0.0:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
   integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
 
-acorn-walk@^7.1.1:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
-  integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-
 acorn@^5.0.0, acorn@^5.3.0:
   version "5.5.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
@@ -1461,11 +170,6 @@ acorn@^6.0.7, acorn@^6.1.1:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
   integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
 
-acorn@^7.1.1:
-  version "7.4.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
-  integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
-
 agent-base@4, agent-base@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
@@ -1498,16 +202,6 @@ ajv@^6.0.1:
     json-schema-traverse "^0.3.0"
     uri-js "^4.2.1"
 
-ajv@^6.12.3:
-  version "6.12.5"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da"
-  integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==
-  dependencies:
-    fast-deep-equal "^3.1.1"
-    fast-json-stable-stringify "^2.0.0"
-    json-schema-traverse "^0.4.1"
-    uri-js "^4.2.2"
-
 ajv@^6.9.1:
   version "6.10.0"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
@@ -1528,13 +222,6 @@ ansi-escapes@^3.2.0:
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
-ansi-escapes@^4.2.1:
-  version "4.3.1"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
-  integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
-  dependencies:
-    type-fest "^0.11.0"
-
 ansi-regex@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@@ -1550,11 +237,6 @@ ansi-regex@^4.1.0:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
   integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
 
-ansi-regex@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
-  integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
-
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1567,35 +249,11 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   dependencies:
     color-convert "^1.9.0"
 
-ansi-styles@^4.0.0, ansi-styles@^4.1.0:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
-  integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
-  dependencies:
-    "@types/color-name" "^1.1.1"
-    color-convert "^2.0.1"
-
 any-observable@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
   integrity sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=
 
-anymatch@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
-  integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
-  dependencies:
-    micromatch "^3.1.4"
-    normalize-path "^2.1.1"
-
-anymatch@^3.0.3:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
-  integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
-  dependencies:
-    normalize-path "^3.0.0"
-    picomatch "^2.0.4"
-
 app-root-path@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
@@ -1698,11 +356,6 @@ aws4@^1.6.0:
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
   integrity sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==
 
-aws4@^1.8.0:
-  version "1.10.1"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428"
-  integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==
-
 babel-code-frame@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@ -1895,20 +548,6 @@ babel-helpers@^6.24.1:
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
-babel-jest@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.3.0.tgz#10d0ca4b529ca3e7d1417855ef7d7bd6fc0c3463"
-  integrity sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==
-  dependencies:
-    "@jest/transform" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/babel__core" "^7.1.7"
-    babel-plugin-istanbul "^6.0.0"
-    babel-preset-jest "^26.3.0"
-    chalk "^4.0.0"
-    graceful-fs "^4.2.4"
-    slash "^3.0.0"
-
 babel-loader@^7.1.4:
   version "7.1.4"
   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015"
@@ -1932,34 +571,6 @@ babel-plugin-check-es2015-constants@^6.22.0:
   dependencies:
     babel-runtime "^6.22.0"
 
-babel-plugin-dynamic-import-node@^2.3.3:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
-  integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
-  dependencies:
-    object.assign "^4.1.0"
-
-babel-plugin-istanbul@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765"
-  integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@istanbuljs/load-nyc-config" "^1.0.0"
-    "@istanbuljs/schema" "^0.1.2"
-    istanbul-lib-instrument "^4.0.0"
-    test-exclude "^6.0.0"
-
-babel-plugin-jest-hoist@^26.2.0:
-  version "26.2.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz#bdd0011df0d3d513e5e95f76bd53b51147aca2dd"
-  integrity sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==
-  dependencies:
-    "@babel/template" "^7.3.3"
-    "@babel/types" "^7.3.3"
-    "@types/babel__core" "^7.0.0"
-    "@types/babel__traverse" "^7.0.6"
-
 babel-plugin-module-resolver@^3.0.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f"
@@ -2294,23 +905,6 @@ babel-polyfill@^6.26.0:
     core-js "^2.5.0"
     regenerator-runtime "^0.10.5"
 
-babel-preset-current-node-syntax@^0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da"
-  integrity sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==
-  dependencies:
-    "@babel/plugin-syntax-async-generators" "^7.8.4"
-    "@babel/plugin-syntax-bigint" "^7.8.3"
-    "@babel/plugin-syntax-class-properties" "^7.8.3"
-    "@babel/plugin-syntax-import-meta" "^7.8.3"
-    "@babel/plugin-syntax-json-strings" "^7.8.3"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-    "@babel/plugin-syntax-numeric-separator" "^7.8.3"
-    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
 babel-preset-env@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
@@ -2347,14 +941,6 @@ babel-preset-env@^1.6.1:
     invariant "^2.2.2"
     semver "^5.3.0"
 
-babel-preset-jest@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz#ed6344506225c065fd8a0b53e191986f74890776"
-  integrity sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==
-  dependencies:
-    babel-plugin-jest-hoist "^26.2.0"
-    babel-preset-current-node-syntax "^0.1.3"
-
 babel-preset-stage-2@^6.18.0:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
@@ -2543,23 +1129,11 @@ braces@^2.3.1:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
-braces@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
-  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
-  dependencies:
-    fill-range "^7.0.1"
-
 browser-process-hrtime@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
   integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44=
 
-browser-process-hrtime@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
-  integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
-
 browser-resolve@^1.11.2:
   version "1.11.2"
   resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
@@ -2575,23 +1149,6 @@ browserslist@^2.1.2:
     caniuse-lite "^1.0.30000792"
     electron-to-chromium "^1.3.30"
 
-browserslist@^4.12.0, browserslist@^4.8.5:
-  version "4.14.5"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015"
-  integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==
-  dependencies:
-    caniuse-lite "^1.0.30001135"
-    electron-to-chromium "^1.3.571"
-    escalade "^3.1.0"
-    node-releases "^1.1.61"
-
-bser@2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
-  integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
-  dependencies:
-    node-int64 "^0.4.0"
-
 btoa-lite@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
@@ -2652,33 +1209,11 @@ camelcase@^3.0.0:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
   integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
 
-camelcase@^5.0.0, camelcase@^5.3.1:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
-  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-
-camelcase@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
-  integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
-
 caniuse-lite@^1.0.30000792:
   version "1.0.30000836"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000836.tgz#c08f405b884d36dc44fa4c9a85c2c06cdab1dbb5"
   integrity sha512-DlVR8sVTKDgd7t95U0shX3g7MeJ/DOjKOhUcaiXqnVmnO5sG4Tn2rLVOkVfPUJgnQNxnGe8/4GK0dGSI+AagQw==
 
-caniuse-lite@^1.0.30001135:
-  version "1.0.30001137"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001137.tgz#6f0127b1d3788742561a25af3607a17fc778b803"
-  integrity sha512-54xKQZTqZrKVHmVz0+UvdZR6kQc7pJDgfhsMYDG19ID1BWoNnDMFm5Q3uSBSU401pBvKYMsHAt9qhEDcxmk8aw==
-
-capture-exit@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
-  integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
-  dependencies:
-    rsvp "^4.8.4"
-
 caseless@~0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -2720,19 +1255,6 @@ chalk@^2.4.2:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
-chalk@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
-  integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
-  dependencies:
-    ansi-styles "^4.1.0"
-    supports-color "^7.1.0"
-
-char-regex@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
-  integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
-
 chardet@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -2748,11 +1270,6 @@ ci-info@^1.0.0:
   resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2"
   integrity sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==
 
-ci-info@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
-  integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
-
 class-utils@^0.3.5:
   version "0.3.6"
   resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -2804,15 +1321,6 @@ cliui@^3.2.0:
     strip-ansi "^3.0.1"
     wrap-ansi "^2.0.0"
 
-cliui@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
-  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
-  dependencies:
-    string-width "^4.2.0"
-    strip-ansi "^6.0.0"
-    wrap-ansi "^6.2.0"
-
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -2823,11 +1331,6 @@ code-point-at@^1.0.0:
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
   integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
 
-collect-v8-coverage@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
-  integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
-
 collection-visit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
@@ -2843,23 +1346,11 @@ color-convert@^1.9.0:
   dependencies:
     color-name "^1.1.1"
 
-color-convert@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
-  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
-  dependencies:
-    color-name "~1.1.4"
-
 color-name@^1.1.1:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@~1.1.4:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
-  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
 colors@^1.1.2:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.4.tgz#e0cb41d3e4b20806b3bfc27f4559f01b94bc2f7c"
@@ -2872,13 +1363,6 @@ combined-stream@1.0.6, combined-stream@~1.0.5:
   dependencies:
     delayed-stream "~1.0.0"
 
-combined-stream@^1.0.6, combined-stream@~1.0.6:
-  version "1.0.8"
-  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
-  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
-  dependencies:
-    delayed-stream "~1.0.0"
-
 commander@^2.14.1, commander@^2.9.0:
   version "2.15.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
@@ -2904,13 +1388,6 @@ contains-path@^0.1.0:
   resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
   integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
 
-convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
-  integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
-  dependencies:
-    safe-buffer "~5.1.1"
-
 convert-source-map@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
@@ -2921,14 +1398,6 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-core-js-compat@^3.6.2:
-  version "3.6.5"
-  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
-  integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
-  dependencies:
-    browserslist "^4.8.5"
-    semver "7.0.0"
-
 core-js@^2.4.0, core-js@^2.5.0:
   version "2.5.6"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d"
@@ -2966,7 +1435,7 @@ cross-spawn@^5.0.1:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+cross-spawn@^6.0.5:
   version "6.0.5"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
   integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -2977,15 +1446,6 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^7.0.0:
-  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"
-    which "^2.0.1"
-
 crypt@~0.0.1:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
@@ -3003,16 +1463,6 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
   integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=
 
-cssom@^0.4.4:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
-  integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
-
-cssom@~0.3.6:
-  version "0.3.8"
-  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
-  integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
-
 "cssstyle@>= 0.2.37 < 0.3.0":
   version "0.2.37"
   resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
@@ -3020,13 +1470,6 @@ cssom@~0.3.6:
   dependencies:
     cssom "0.3.x"
 
-cssstyle@^2.2.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
-  integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
-  dependencies:
-    cssom "~0.3.6"
-
 dashdash@^1.12.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -3043,15 +1486,6 @@ data-urls@^1.0.0:
     whatwg-mimetype "^2.0.0"
     whatwg-url "^6.4.0"
 
-data-urls@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
-  integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
-  dependencies:
-    abab "^2.0.3"
-    whatwg-mimetype "^2.3.0"
-    whatwg-url "^8.0.0"
-
 date-fns@^1.27.2:
   version "1.29.0"
   resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
@@ -3085,23 +1519,11 @@ debug@^4.0.1:
   dependencies:
     ms "^2.1.1"
 
-debug@^4.1.0, debug@^4.1.1:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
-  integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
-  dependencies:
-    ms "2.1.2"
-
-decamelize@^1.1.1, decamelize@^1.2.0:
+decamelize@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
-decimal.js@^10.2.0:
-  version "10.2.0"
-  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
-  integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==
-
 decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -3124,12 +1546,7 @@ deep-is@~0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
-deepmerge@^4.2.2:
-  version "4.2.2"
-  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
-  integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
-
-define-properties@^1.1.2, define-properties@^1.1.3:
+define-properties@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
   integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@@ -3170,16 +1587,6 @@ detect-indent@^4.0.0:
   dependencies:
     repeating "^2.0.0"
 
-detect-newline@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
-  integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
-
-diff-sequences@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.3.0.tgz#62a59b1b29ab7fd27cef2a33ae52abe73042d0a2"
-  integrity sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==
-
 diff@^3.2.0:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -3214,13 +1621,6 @@ domexception@^1.0.0:
   dependencies:
     webidl-conversions "^4.0.2"
 
-domexception@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
-  integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
-  dependencies:
-    webidl-conversions "^5.0.0"
-
 duplexer2@~0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
@@ -3245,43 +1645,21 @@ electron-to-chromium@^1.3.30:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz#458ac1b1c5c760ce8811a16d2bfbd97ec30bafb8"
   integrity sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=
 
-electron-to-chromium@^1.3.571:
-  version "1.3.574"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.574.tgz#bdd87f62fe70165e5c862a0acf0cee9889e23aa3"
-  integrity sha512-kF8Bfe1h8X1pPwlw6oRoIXj0DevowviP6fl0wcljm+nZjy/7+Fos4THo1N/7dVGEJlyEqK9C8qNnbheH+Eazfw==
-
 elegant-spinner@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
   integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
 
-emittery@^0.7.1:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451"
-  integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==
-
 emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
   integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
 
-emoji-regex@^8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
-  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
 emojis-list@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
   integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
 
-end-of-stream@^1.1.0:
-  version "1.4.4"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
-  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
-  dependencies:
-    once "^1.4.0"
-
 error-ex@^1.2.0, error-ex@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
@@ -3301,41 +1679,6 @@ es-abstract@^1.11.0, es-abstract@^1.7.0:
     is-regex "^1.0.4"
     object-keys "^1.0.12"
 
-es-abstract@^1.17.5:
-  version "1.17.6"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
-  integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
-  dependencies:
-    es-to-primitive "^1.2.1"
-    function-bind "^1.1.1"
-    has "^1.0.3"
-    has-symbols "^1.0.1"
-    is-callable "^1.2.0"
-    is-regex "^1.1.0"
-    object-inspect "^1.7.0"
-    object-keys "^1.1.1"
-    object.assign "^4.1.0"
-    string.prototype.trimend "^1.0.1"
-    string.prototype.trimstart "^1.0.1"
-
-es-abstract@^1.18.0-next.0:
-  version "1.18.0-next.0"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc"
-  integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==
-  dependencies:
-    es-to-primitive "^1.2.1"
-    function-bind "^1.1.1"
-    has "^1.0.3"
-    has-symbols "^1.0.1"
-    is-callable "^1.2.0"
-    is-negative-zero "^2.0.0"
-    is-regex "^1.1.1"
-    object-inspect "^1.8.0"
-    object-keys "^1.1.1"
-    object.assign "^4.1.0"
-    string.prototype.trimend "^1.0.1"
-    string.prototype.trimstart "^1.0.1"
-
 es-to-primitive@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
@@ -3345,15 +1688,6 @@ es-to-primitive@^1.2.0:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
-es-to-primitive@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
-  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
-  dependencies:
-    is-callable "^1.1.4"
-    is-date-object "^1.0.1"
-    is-symbol "^1.0.2"
-
 es6-promise@^4.0.3:
   version "4.2.8"
   resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
@@ -3366,33 +1700,11 @@ es6-promisify@^5.0.0:
   dependencies:
     es6-promise "^4.0.3"
 
-escalade@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e"
-  integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==
-
 escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-escape-string-regexp@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
-  integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-
-escodegen@^1.14.1:
-  version "1.14.3"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
-  integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
-  dependencies:
-    esprima "^4.0.1"
-    estraverse "^4.2.0"
-    esutils "^2.0.2"
-    optionator "^0.8.1"
-  optionalDependencies:
-    source-map "~0.6.1"
-
 escodegen@^1.9.0:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
@@ -3582,7 +1894,7 @@ esprima@^3.1.3:
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
   integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
 
-esprima@^4.0.0, esprima@^4.0.1:
+esprima@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -3626,11 +1938,6 @@ esutils@^2.0.2:
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
   integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
 
-exec-sh@^0.3.2:
-  version "0.3.4"
-  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5"
-  integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==
-
 execa@^0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01"
@@ -3644,44 +1951,11 @@ execa@^0.9.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
-execa@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
-  integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
-  dependencies:
-    cross-spawn "^6.0.0"
-    get-stream "^4.0.0"
-    is-stream "^1.1.0"
-    npm-run-path "^2.0.0"
-    p-finally "^1.0.0"
-    signal-exit "^3.0.0"
-    strip-eof "^1.0.0"
-
-execa@^4.0.0:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2"
-  integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==
-  dependencies:
-    cross-spawn "^7.0.0"
-    get-stream "^5.0.0"
-    human-signals "^1.1.1"
-    is-stream "^2.0.0"
-    merge-stream "^2.0.0"
-    npm-run-path "^4.0.0"
-    onetime "^5.1.0"
-    signal-exit "^3.0.2"
-    strip-final-newline "^2.0.0"
-
 exit-hook@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
   integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
 
-exit@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
-  integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
-
 expand-brackets@^0.1.4:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -3721,18 +1995,6 @@ expect@^22.4.3:
     jest-message-util "^22.4.3"
     jest-regex-util "^22.4.3"
 
-expect@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-26.4.2.tgz#36db120928a5a2d7d9736643032de32f24e1b2a1"
-  integrity sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    ansi-styles "^4.0.0"
-    jest-get-type "^26.3.0"
-    jest-matcher-utils "^26.4.2"
-    jest-message-util "^26.3.0"
-    jest-regex-util "^26.0.0"
-
 extend-shallow@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
@@ -3748,7 +2010,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
     assign-symbols "^1.0.0"
     is-extendable "^1.0.1"
 
-extend@~3.0.1, extend@~3.0.2:
+extend@~3.0.1:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@@ -3803,11 +2065,6 @@ fast-deep-equal@^2.0.1:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
   integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
 
-fast-deep-equal@^3.1.1:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
-  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-
 fast-json-stable-stringify@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
@@ -3818,13 +2075,6 @@ fast-levenshtein@~2.0.4:
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
-fb-watchman@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
-  integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
-  dependencies:
-    bser "2.1.1"
-
 figures@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
@@ -3873,13 +2123,6 @@ fill-range@^4.0.0:
     repeat-string "^1.6.1"
     to-regex-range "^2.1.0"
 
-fill-range@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
-  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
-  dependencies:
-    to-regex-range "^5.0.1"
-
 find-babel-config@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355"
@@ -3917,14 +2160,6 @@ find-up@^2.0.0, find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
-find-up@^4.0.0, find-up@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
-  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
-  dependencies:
-    locate-path "^5.0.0"
-    path-exists "^4.0.0"
-
 flat-cache@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
@@ -3999,15 +2234,6 @@ form-data@~2.3.1:
     combined-stream "1.0.6"
     mime-types "^2.1.12"
 
-form-data@~2.3.2:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
-  integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
-  dependencies:
-    asynckit "^0.4.0"
-    combined-stream "^1.0.6"
-    mime-types "^2.1.12"
-
 fragment-cache@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -4038,11 +2264,6 @@ fs.realpath@^1.0.0:
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
   integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-fsevents@^2.1.2:
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
-  integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
-
 fstream@~1.0.10:
   version "1.0.12"
   resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
@@ -4063,50 +2284,21 @@ functional-red-black-tree@^1.0.1:
   resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
   integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 
-gensync@^1.0.0-beta.1:
-  version "1.0.0-beta.1"
-  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
-  integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
-
 get-caller-file@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
   integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=
 
-get-caller-file@^2.0.1:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
-  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-
 get-own-enumerable-property-symbols@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b"
   integrity sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==
 
-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@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
   integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
 
-get-stream@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
-  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
-  dependencies:
-    pump "^3.0.0"
-
-get-stream@^5.0.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
-  integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
-  dependencies:
-    pump "^3.0.0"
-
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -4158,18 +2350,6 @@ glob@^7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.1.4:
-  version "7.1.6"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
-  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.4"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
 globals@^11.1.0:
   version "11.5.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642"
@@ -4210,16 +2390,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
   integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
 
-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==
-
-growly@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
-  integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
-
 har-schema@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
@@ -4233,14 +2403,6 @@ har-validator@~5.0.3:
     ajv "^5.1.0"
     har-schema "^2.0.0"
 
-har-validator@~5.1.3:
-  version "5.1.5"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
-  integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
-  dependencies:
-    ajv "^6.12.3"
-    har-schema "^2.0.0"
-
 has-ansi@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -4253,11 +2415,6 @@ has-flag@^3.0.0:
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
   integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
 
-has-flag@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
-  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
 has-symbol-support-x@^1.4.1:
   version "1.4.2"
   resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
@@ -4268,11 +2425,6 @@ has-symbols@^1.0.0:
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
   integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
 
-has-symbols@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
-  integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
-
 has-to-string-tag-x@^1.2.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
@@ -4360,18 +2512,6 @@ html-encoding-sniffer@^1.0.2:
   dependencies:
     whatwg-encoding "^1.0.1"
 
-html-encoding-sniffer@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
-  integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
-  dependencies:
-    whatwg-encoding "^1.0.5"
-
-html-escaper@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
-  integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-
 http-proxy-agent@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
@@ -4397,11 +2537,6 @@ https-proxy-agent@^2.2.0:
     agent-base "^4.3.0"
     debug "^3.1.0"
 
-human-signals@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
-  integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-
 husky@^0.14.3:
   version "0.14.3"
   resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3"
@@ -4416,7 +2551,7 @@ iconv-lite@0.4.19:
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
   integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==
 
-iconv-lite@0.4.24, iconv-lite@^0.4.24:
+iconv-lite@^0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -4441,14 +2576,6 @@ import-fresh@^3.0.0:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
 
-import-local@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6"
-  integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==
-  dependencies:
-    pkg-dir "^4.2.0"
-    resolve-cwd "^3.0.0"
-
 imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -4498,7 +2625,7 @@ inquirer@^6.2.2:
     strip-ansi "^5.1.0"
     through "^2.3.6"
 
-invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.4:
+invariant@^2.2.0, invariant@^2.2.2:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
   integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -4510,11 +2637,6 @@ invert-kv@^1.0.0:
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
   integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
 
-ip-regex@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
-  integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
-
 is-accessor-descriptor@^0.1.6:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -4551,11 +2673,6 @@ is-callable@^1.1.4:
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
   integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
 
-is-callable@^1.2.0:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
-  integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
-
 is-ci@^1.0.10:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
@@ -4563,13 +2680,6 @@ is-ci@^1.0.10:
   dependencies:
     ci-info "^1.0.0"
 
-is-ci@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
-  integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
-  dependencies:
-    ci-info "^2.0.0"
-
 is-data-descriptor@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -4612,11 +2722,6 @@ 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.1.1"
-  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
-  integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==
-
 is-dotfile@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
@@ -4670,21 +2775,11 @@ is-fullwidth-code-point@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
   integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
 
-is-fullwidth-code-point@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
-  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
 is-generator-fn@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
   integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=
 
-is-generator-fn@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
-  integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-
 is-glob@^2.0.0, is-glob@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -4699,11 +2794,6 @@ is-glob@^4.0.0:
   dependencies:
     is-extglob "^2.1.1"
 
-is-negative-zero@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
-  integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
-
 is-number@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -4723,11 +2813,6 @@ is-number@^4.0.0:
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
   integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
 
-is-number@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
-  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
 is-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
@@ -4769,11 +2854,6 @@ is-posix-bracket@^0.1.0:
   resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
   integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=
 
-is-potential-custom-element-name@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397"
-  integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c=
-
 is-primitive@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
@@ -4791,13 +2871,6 @@ is-regex@^1.0.4:
   dependencies:
     has "^1.0.1"
 
-is-regex@^1.1.0, is-regex@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
-  integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
-  dependencies:
-    has-symbols "^1.0.1"
-
 is-regexp@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
@@ -4813,11 +2886,6 @@ is-stream@^1.0.0, is-stream@^1.1.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
   integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
 
-is-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
-  integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
-
 is-symbol@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
@@ -4825,7 +2893,7 @@ is-symbol@^1.0.2:
   dependencies:
     has-symbols "^1.0.0"
 
-is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
   integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
@@ -4840,13 +2908,6 @@ is-windows@^1.0.0, is-windows@^1.0.2:
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
   integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
-is-wsl@^2.2.0:
-  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@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -4874,47 +2935,6 @@ isstream@~0.1.2:
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
-istanbul-lib-coverage@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec"
-  integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==
-
-istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
-  integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
-  dependencies:
-    "@babel/core" "^7.7.5"
-    "@istanbuljs/schema" "^0.1.2"
-    istanbul-lib-coverage "^3.0.0"
-    semver "^6.3.0"
-
-istanbul-lib-report@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
-  integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
-  dependencies:
-    istanbul-lib-coverage "^3.0.0"
-    make-dir "^3.0.0"
-    supports-color "^7.1.0"
-
-istanbul-lib-source-maps@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9"
-  integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==
-  dependencies:
-    debug "^4.1.1"
-    istanbul-lib-coverage "^3.0.0"
-    source-map "^0.6.1"
-
-istanbul-reports@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b"
-  integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==
-  dependencies:
-    html-escaper "^2.0.0"
-    istanbul-lib-report "^3.0.0"
-
 isurl@^1.0.0-alpha5:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
@@ -4923,34 +2943,6 @@ isurl@^1.0.0-alpha5:
     has-to-string-tag-x "^1.2.0"
     is-object "^1.0.1"
 
-jest-changed-files@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.3.0.tgz#68fb2a7eb125f50839dab1f5a17db3607fe195b1"
-  integrity sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    execa "^4.0.0"
-    throat "^5.0.0"
-
-jest-cli@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.4.2.tgz#24afc6e4dfc25cde4c7ec4226fb7db5f157c21da"
-  integrity sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==
-  dependencies:
-    "@jest/core" "^26.4.2"
-    "@jest/test-result" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    chalk "^4.0.0"
-    exit "^0.1.2"
-    graceful-fs "^4.2.4"
-    import-local "^3.0.2"
-    is-ci "^2.0.0"
-    jest-config "^26.4.2"
-    jest-util "^26.3.0"
-    jest-validate "^26.4.2"
-    prompts "^2.0.1"
-    yargs "^15.3.1"
-
 jest-config@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.3.tgz#0e9d57db267839ea31309119b41dc2fa31b76403"
@@ -4968,30 +2960,6 @@ jest-config@^22.4.3:
     jest-validate "^22.4.3"
     pretty-format "^22.4.3"
 
-jest-config@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.4.2.tgz#da0cbb7dc2c131ffe831f0f7f2a36256e6086558"
-  integrity sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==
-  dependencies:
-    "@babel/core" "^7.1.0"
-    "@jest/test-sequencer" "^26.4.2"
-    "@jest/types" "^26.3.0"
-    babel-jest "^26.3.0"
-    chalk "^4.0.0"
-    deepmerge "^4.2.2"
-    glob "^7.1.1"
-    graceful-fs "^4.2.4"
-    jest-environment-jsdom "^26.3.0"
-    jest-environment-node "^26.3.0"
-    jest-get-type "^26.3.0"
-    jest-jasmine2 "^26.4.2"
-    jest-regex-util "^26.0.0"
-    jest-resolve "^26.4.0"
-    jest-util "^26.3.0"
-    jest-validate "^26.4.2"
-    micromatch "^4.0.2"
-    pretty-format "^26.4.2"
-
 jest-diff@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030"
@@ -5002,34 +2970,6 @@ jest-diff@^22.4.3:
     jest-get-type "^22.4.3"
     pretty-format "^22.4.3"
 
-jest-diff@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.4.2.tgz#a1b7b303bcc534aabdb3bd4a7caf594ac059f5aa"
-  integrity sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==
-  dependencies:
-    chalk "^4.0.0"
-    diff-sequences "^26.3.0"
-    jest-get-type "^26.3.0"
-    pretty-format "^26.4.2"
-
-jest-docblock@^26.0.0:
-  version "26.0.0"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
-  integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==
-  dependencies:
-    detect-newline "^3.0.0"
-
-jest-each@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.4.2.tgz#bb14f7f4304f2bb2e2b81f783f989449b8b6ffae"
-  integrity sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    chalk "^4.0.0"
-    jest-get-type "^26.3.0"
-    jest-util "^26.3.0"
-    pretty-format "^26.4.2"
-
 jest-environment-jsdom@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e"
@@ -5039,19 +2979,6 @@ jest-environment-jsdom@^22.4.3:
     jest-util "^22.4.3"
     jsdom "^11.5.1"
 
-jest-environment-jsdom@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz#3b749ba0f3a78e92ba2c9ce519e16e5dd515220c"
-  integrity sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==
-  dependencies:
-    "@jest/environment" "^26.3.0"
-    "@jest/fake-timers" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    jest-mock "^26.3.0"
-    jest-util "^26.3.0"
-    jsdom "^16.2.2"
-
 jest-environment-node@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129"
@@ -5060,49 +2987,11 @@ jest-environment-node@^22.4.3:
     jest-mock "^22.4.3"
     jest-util "^22.4.3"
 
-jest-environment-node@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.3.0.tgz#56c6cfb506d1597f94ee8d717072bda7228df849"
-  integrity sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==
-  dependencies:
-    "@jest/environment" "^26.3.0"
-    "@jest/fake-timers" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    jest-mock "^26.3.0"
-    jest-util "^26.3.0"
-
 jest-get-type@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
   integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==
 
-jest-get-type@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
-  integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
-
-jest-haste-map@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.3.0.tgz#c51a3b40100d53ab777bfdad382d2e7a00e5c726"
-  integrity sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    "@types/graceful-fs" "^4.1.2"
-    "@types/node" "*"
-    anymatch "^3.0.3"
-    fb-watchman "^2.0.0"
-    graceful-fs "^4.2.4"
-    jest-regex-util "^26.0.0"
-    jest-serializer "^26.3.0"
-    jest-util "^26.3.0"
-    jest-worker "^26.3.0"
-    micromatch "^4.0.2"
-    sane "^4.0.3"
-    walker "^1.0.7"
-  optionalDependencies:
-    fsevents "^2.1.2"
-
 jest-jasmine2@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz#4daf64cd14c793da9db34a7c7b8dcfe52a745965"
@@ -5120,38 +3009,6 @@ jest-jasmine2@^22.4.3:
     jest-util "^22.4.3"
     source-map-support "^0.5.0"
 
-jest-jasmine2@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz#18a9d5bec30904267ac5e9797570932aec1e2257"
-  integrity sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==
-  dependencies:
-    "@babel/traverse" "^7.1.0"
-    "@jest/environment" "^26.3.0"
-    "@jest/source-map" "^26.3.0"
-    "@jest/test-result" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    chalk "^4.0.0"
-    co "^4.6.0"
-    expect "^26.4.2"
-    is-generator-fn "^2.0.0"
-    jest-each "^26.4.2"
-    jest-matcher-utils "^26.4.2"
-    jest-message-util "^26.3.0"
-    jest-runtime "^26.4.2"
-    jest-snapshot "^26.4.2"
-    jest-util "^26.3.0"
-    pretty-format "^26.4.2"
-    throat "^5.0.0"
-
-jest-leak-detector@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz#c73e2fa8757bf905f6f66fb9e0070b70fa0f573f"
-  integrity sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==
-  dependencies:
-    jest-get-type "^26.3.0"
-    pretty-format "^26.4.2"
-
 jest-matcher-utils@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff"
@@ -5161,16 +3018,6 @@ jest-matcher-utils@^22.4.3:
     jest-get-type "^22.4.3"
     pretty-format "^22.4.3"
 
-jest-matcher-utils@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz#fa81f3693f7cb67e5fc1537317525ef3b85f4b06"
-  integrity sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==
-  dependencies:
-    chalk "^4.0.0"
-    jest-diff "^26.4.2"
-    jest-get-type "^26.3.0"
-    pretty-format "^26.4.2"
-
 jest-message-util@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7"
@@ -5182,57 +3029,16 @@ jest-message-util@^22.4.3:
     slash "^1.0.0"
     stack-utils "^1.0.1"
 
-jest-message-util@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.3.0.tgz#3bdb538af27bb417f2d4d16557606fd082d5841a"
-  integrity sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==
-  dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@jest/types" "^26.3.0"
-    "@types/stack-utils" "^1.0.1"
-    chalk "^4.0.0"
-    graceful-fs "^4.2.4"
-    micromatch "^4.0.2"
-    slash "^3.0.0"
-    stack-utils "^2.0.2"
-
 jest-mock@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7"
   integrity sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==
 
-jest-mock@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.3.0.tgz#ee62207c3c5ebe5f35b760e1267fee19a1cfdeba"
-  integrity sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-
-jest-pnp-resolver@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
-  integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
-
 jest-regex-util@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af"
   integrity sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==
 
-jest-regex-util@^26.0.0:
-  version "26.0.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
-  integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
-
-jest-resolve-dependencies@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz#739bdb027c14befb2fe5aabbd03f7bab355f1dc5"
-  integrity sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    jest-regex-util "^26.0.0"
-    jest-snapshot "^26.4.2"
-
 jest-resolve@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea"
@@ -5241,86 +3047,6 @@ jest-resolve@^22.4.3:
     browser-resolve "^1.11.2"
     chalk "^2.0.1"
 
-jest-resolve@^26.4.0:
-  version "26.4.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.4.0.tgz#6dc0af7fb93e65b73fec0368ca2b76f3eb59a6d7"
-  integrity sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    chalk "^4.0.0"
-    graceful-fs "^4.2.4"
-    jest-pnp-resolver "^1.2.2"
-    jest-util "^26.3.0"
-    read-pkg-up "^7.0.1"
-    resolve "^1.17.0"
-    slash "^3.0.0"
-
-jest-runner@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.4.2.tgz#c3ec5482c8edd31973bd3935df5a449a45b5b853"
-  integrity sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==
-  dependencies:
-    "@jest/console" "^26.3.0"
-    "@jest/environment" "^26.3.0"
-    "@jest/test-result" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    chalk "^4.0.0"
-    emittery "^0.7.1"
-    exit "^0.1.2"
-    graceful-fs "^4.2.4"
-    jest-config "^26.4.2"
-    jest-docblock "^26.0.0"
-    jest-haste-map "^26.3.0"
-    jest-leak-detector "^26.4.2"
-    jest-message-util "^26.3.0"
-    jest-resolve "^26.4.0"
-    jest-runtime "^26.4.2"
-    jest-util "^26.3.0"
-    jest-worker "^26.3.0"
-    source-map-support "^0.5.6"
-    throat "^5.0.0"
-
-jest-runtime@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.4.2.tgz#94ce17890353c92e4206580c73a8f0c024c33c42"
-  integrity sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==
-  dependencies:
-    "@jest/console" "^26.3.0"
-    "@jest/environment" "^26.3.0"
-    "@jest/fake-timers" "^26.3.0"
-    "@jest/globals" "^26.4.2"
-    "@jest/source-map" "^26.3.0"
-    "@jest/test-result" "^26.3.0"
-    "@jest/transform" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/yargs" "^15.0.0"
-    chalk "^4.0.0"
-    collect-v8-coverage "^1.0.0"
-    exit "^0.1.2"
-    glob "^7.1.3"
-    graceful-fs "^4.2.4"
-    jest-config "^26.4.2"
-    jest-haste-map "^26.3.0"
-    jest-message-util "^26.3.0"
-    jest-mock "^26.3.0"
-    jest-regex-util "^26.0.0"
-    jest-resolve "^26.4.0"
-    jest-snapshot "^26.4.2"
-    jest-util "^26.3.0"
-    jest-validate "^26.4.2"
-    slash "^3.0.0"
-    strip-bom "^4.0.0"
-    yargs "^15.3.1"
-
-jest-serializer@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.3.0.tgz#1c9d5e1b74d6e5f7e7f9627080fa205d976c33ef"
-  integrity sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==
-  dependencies:
-    "@types/node" "*"
-    graceful-fs "^4.2.4"
-
 jest-snapshot@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2"
@@ -5333,27 +3059,6 @@ jest-snapshot@^22.4.3:
     natural-compare "^1.4.0"
     pretty-format "^22.4.3"
 
-jest-snapshot@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.4.2.tgz#87d3ac2f2bd87ea8003602fbebd8fcb9e94104f6"
-  integrity sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==
-  dependencies:
-    "@babel/types" "^7.0.0"
-    "@jest/types" "^26.3.0"
-    "@types/prettier" "^2.0.0"
-    chalk "^4.0.0"
-    expect "^26.4.2"
-    graceful-fs "^4.2.4"
-    jest-diff "^26.4.2"
-    jest-get-type "^26.3.0"
-    jest-haste-map "^26.3.0"
-    jest-matcher-utils "^26.4.2"
-    jest-message-util "^26.3.0"
-    jest-resolve "^26.4.0"
-    natural-compare "^1.4.0"
-    pretty-format "^26.4.2"
-    semver "^7.3.2"
-
 jest-util@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac"
@@ -5367,18 +3072,6 @@ jest-util@^22.4.3:
     mkdirp "^0.5.1"
     source-map "^0.6.0"
 
-jest-util@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.3.0.tgz#a8974b191df30e2bf523ebbfdbaeb8efca535b3e"
-  integrity sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    chalk "^4.0.0"
-    graceful-fs "^4.2.4"
-    is-ci "^2.0.0"
-    micromatch "^4.0.2"
-
 jest-validate@^22.4.0, jest-validate@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.3.tgz#0780954a5a7daaeec8d3c10834b9280865976b30"
@@ -5390,49 +3083,6 @@ jest-validate@^22.4.0, jest-validate@^22.4.3:
     leven "^2.1.0"
     pretty-format "^22.4.3"
 
-jest-validate@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.4.2.tgz#e871b0dfe97747133014dcf6445ee8018398f39c"
-  integrity sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    camelcase "^6.0.0"
-    chalk "^4.0.0"
-    jest-get-type "^26.3.0"
-    leven "^3.1.0"
-    pretty-format "^26.4.2"
-
-jest-watcher@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.3.0.tgz#f8ef3068ddb8af160ef868400318dc4a898eed08"
-  integrity sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==
-  dependencies:
-    "@jest/test-result" "^26.3.0"
-    "@jest/types" "^26.3.0"
-    "@types/node" "*"
-    ansi-escapes "^4.2.1"
-    chalk "^4.0.0"
-    jest-util "^26.3.0"
-    string-length "^4.0.1"
-
-jest-worker@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f"
-  integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==
-  dependencies:
-    "@types/node" "*"
-    merge-stream "^2.0.0"
-    supports-color "^7.0.0"
-
-jest@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-26.4.2.tgz#7e8bfb348ec33f5459adeaffc1a25d5752d9d312"
-  integrity sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw==
-  dependencies:
-    "@jest/core" "^26.4.2"
-    import-local "^3.0.2"
-    jest-cli "^26.4.2"
-
 js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
@@ -5451,14 +3101,6 @@ js-yaml@^3.13.0, js-yaml@^3.9.0:
     argparse "^1.0.7"
     esprima "^4.0.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"
-
 jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -5496,38 +3138,6 @@ jsdom@^11.5.1:
     ws "^4.0.0"
     xml-name-validator "^3.0.0"
 
-jsdom@^16.2.2:
-  version "16.4.0"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb"
-  integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==
-  dependencies:
-    abab "^2.0.3"
-    acorn "^7.1.1"
-    acorn-globals "^6.0.0"
-    cssom "^0.4.4"
-    cssstyle "^2.2.0"
-    data-urls "^2.0.0"
-    decimal.js "^10.2.0"
-    domexception "^2.0.1"
-    escodegen "^1.14.1"
-    html-encoding-sniffer "^2.0.1"
-    is-potential-custom-element-name "^1.0.0"
-    nwsapi "^2.2.0"
-    parse5 "5.1.1"
-    request "^2.88.2"
-    request-promise-native "^1.0.8"
-    saxes "^5.0.0"
-    symbol-tree "^3.2.4"
-    tough-cookie "^3.0.1"
-    w3c-hr-time "^1.0.2"
-    w3c-xmlserializer "^2.0.0"
-    webidl-conversions "^6.1.0"
-    whatwg-encoding "^1.0.5"
-    whatwg-mimetype "^2.3.0"
-    whatwg-url "^8.0.0"
-    ws "^7.2.3"
-    xml-name-validator "^3.0.0"
-
 jsesc@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
@@ -5548,11 +3158,6 @@ json-parse-better-errors@^1.0.1:
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
   integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
 
-json-parse-even-better-errors@^2.3.0:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
-  integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
-
 json-schema-traverse@^0.3.0:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
@@ -5583,13 +3188,6 @@ json5@^0.5.0, json5@^0.5.1:
   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
   integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
 
-json5@^2.1.2:
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
-  integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
-  dependencies:
-    minimist "^1.2.5"
-
 jsonfile@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -5638,11 +3236,6 @@ kind-of@^6.0.0, kind-of@^6.0.2:
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
   integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
 
-kleur@^3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
-  integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-
 lcid@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -5660,18 +3253,6 @@ leven@^2.1.0:
   resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
   integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
 
-leven@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
-  integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
-
-levenary@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
-  integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
-  dependencies:
-    leven "^3.1.0"
-
 levn@^0.3.0, levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -5680,11 +3261,6 @@ levn@^0.3.0, levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-lines-and-columns@^1.1.6:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
-  integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
-
 lint-staged@^7.0.4:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.1.0.tgz#1514a5b71b8d9492ca0c3d2a44769cbcbc8bcc79"
@@ -5809,13 +3385,6 @@ locate-path@^2.0.0:
     p-locate "^2.0.0"
     path-exists "^3.0.0"
 
-locate-path@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
-  integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
-  dependencies:
-    p-locate "^4.1.0"
-
 lodash.assign@^4.0.3, lodash.assign@^4.0.6:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@@ -5831,11 +3400,6 @@ lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
 
-lodash@^4.17.19:
-  version "4.17.20"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
-  integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-
 log-symbols@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
@@ -5885,13 +3449,6 @@ lru-cache@^4.0.1:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
 
-lru-cache@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
-  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
-  dependencies:
-    yallist "^4.0.0"
-
 magic-string@^0.25.2:
   version "0.25.3"
   resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.3.tgz#34b8d2a2c7fec9d9bdf9929a3fd81d271ef35be9"
@@ -5906,20 +3463,6 @@ make-dir@^1.0.0:
   dependencies:
     pify "^3.0.0"
 
-make-dir@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
-  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
-  dependencies:
-    semver "^6.0.0"
-
-makeerror@1.0.x:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
-  integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
-  dependencies:
-    tmpl "1.0.x"
-
 map-cache@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -5946,11 +3489,6 @@ md5@^2.1.0:
     crypt "~0.0.1"
     is-buffer "~1.1.1"
 
-merge-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
-  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
 micromatch@^2.3.11:
   version "2.3.11"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
@@ -5970,7 +3508,7 @@ micromatch@^2.3.11:
     parse-glob "^3.0.4"
     regex-cache "^0.4.2"
 
-micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+micromatch@^3.1.10, micromatch@^3.1.8:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
   integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -5989,19 +3527,6 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
-micromatch@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
-  integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
-  dependencies:
-    braces "^3.0.1"
-    picomatch "^2.0.5"
-
-mime-db@1.44.0:
-  version "1.44.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
-  integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
-
 mime-db@~1.33.0:
   version "1.33.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
@@ -6014,23 +3539,11 @@ mime-types@^2.1.12, mime-types@~2.1.17:
   dependencies:
     mime-db "~1.33.0"
 
-mime-types@~2.1.19:
-  version "2.1.27"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
-  integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
-  dependencies:
-    mime-db "1.44.0"
-
 mimic-fn@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
   integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
 
-mimic-fn@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
-  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
 mimic-response@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
@@ -6048,11 +3561,6 @@ minimist@0.0.8:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
   integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
 
-minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
-  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
 mixin-deep@^1.2.0:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
@@ -6073,7 +3581,7 @@ ms@2.0.0:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
   integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
-ms@2.1.2, ms@^2.1.1:
+ms@^2.1.1:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -6112,36 +3620,9 @@ nice-try@^1.0.4:
   integrity sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==
 
 node-fetch@^2.1.1:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
-  integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-
-node-int64@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
-  integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-
-node-modules-regexp@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
-  integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
-
-node-notifier@^8.0.0:
-  version "8.0.1"
-  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1"
-  integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==
-  dependencies:
-    growly "^1.3.0"
-    is-wsl "^2.2.0"
-    semver "^7.3.2"
-    shellwords "^0.1.1"
-    uuid "^8.3.0"
-    which "^2.0.2"
-
-node-releases@^1.1.61:
-  version "1.1.61"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e"
-  integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5"
+  integrity sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==
 
 normalize-package-data@^2.3.2:
   version "2.4.0"
@@ -6153,33 +3634,18 @@ normalize-package-data@^2.3.2:
     semver "2 || 3 || 4 || 5"
     validate-npm-package-license "^3.0.1"
 
-normalize-package-data@^2.5.0:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
-  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
-  dependencies:
-    hosted-git-info "^2.1.4"
-    resolve "^1.10.0"
-    semver "2 || 3 || 4 || 5"
-    validate-npm-package-license "^3.0.1"
-
 normalize-path@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
   integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=
 
-normalize-path@^2.0.1, normalize-path@^2.1.1:
+normalize-path@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
   integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
   dependencies:
     remove-trailing-separator "^1.0.1"
 
-normalize-path@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
-  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
 npm-path@^2.0.2:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
@@ -6194,13 +3660,6 @@ npm-run-path@^2.0.0:
   dependencies:
     path-key "^2.0.0"
 
-npm-run-path@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
-  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
-  dependencies:
-    path-key "^3.0.0"
-
 npm-which@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
@@ -6220,21 +3679,11 @@ nwmatcher@^1.4.3:
   resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e"
   integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==
 
-nwsapi@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
-  integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
-
 oauth-sign@~0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
   integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=
 
-oauth-sign@~0.9.0:
-  version "0.9.0"
-  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
-  integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-
 object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -6249,12 +3698,7 @@ object-copy@^0.1.0:
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
-object-inspect@^1.7.0, object-inspect@^1.8.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
-  integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
-
-object-keys@^1.0.12, object-keys@^1.1.1:
+object-keys@^1.0.12:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
   integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -6266,16 +3710,6 @@ object-visit@^1.0.0:
   dependencies:
     isobject "^3.0.0"
 
-object.assign@^4.1.0:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
-  integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
-  dependencies:
-    define-properties "^1.1.3"
-    es-abstract "^1.18.0-next.0"
-    has-symbols "^1.0.1"
-    object-keys "^1.1.1"
-
 object.fromentries@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab"
@@ -6301,7 +3735,7 @@ object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
+once@^1.3.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
@@ -6320,13 +3754,6 @@ onetime@^2.0.0:
   dependencies:
     mimic-fn "^1.0.0"
 
-onetime@^5.1.0:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
-  integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
-  dependencies:
-    mimic-fn "^2.1.0"
-
 optionator@^0.8.1, optionator@^0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
@@ -6371,11 +3798,6 @@ p-cancelable@^0.3.0:
   resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
   integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
 
-p-each-series@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48"
-  integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==
-
 p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@@ -6388,13 +3810,6 @@ p-limit@^1.1.0:
   dependencies:
     p-try "^1.0.0"
 
-p-limit@^2.2.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
-  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
-  dependencies:
-    p-try "^2.0.0"
-
 p-locate@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -6402,13 +3817,6 @@ p-locate@^2.0.0:
   dependencies:
     p-limit "^1.1.0"
 
-p-locate@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
-  integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
-  dependencies:
-    p-limit "^2.2.0"
-
 p-map@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
@@ -6426,11 +3834,6 @@ p-try@^1.0.0:
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
   integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
 
-p-try@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
-  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-
 parent-module@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -6463,26 +3866,11 @@ parse-json@^4.0.0:
     error-ex "^1.3.1"
     json-parse-better-errors "^1.0.1"
 
-parse-json@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
-  integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
-  dependencies:
-    "@babel/code-frame" "^7.0.0"
-    error-ex "^1.3.1"
-    json-parse-even-better-errors "^2.3.0"
-    lines-and-columns "^1.1.6"
-
 parse5@4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
   integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
 
-parse5@5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
-  integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
-
 pascalcase@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
@@ -6500,11 +3888,6 @@ path-exists@^3.0.0:
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
   integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
 
-path-exists@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
-  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-
 path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -6520,11 +3903,6 @@ path-key@^2.0.0, path-key@^2.0.1:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
   integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
 
-path-key@^3.0.0, path-key@^3.1.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
-  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
 path-parse@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
@@ -6556,11 +3934,6 @@ performance-now@^2.1.0:
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
   integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
 
-picomatch@^2.0.4, picomatch@^2.0.5:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
-  integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
-
 pify@^2.0.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -6583,13 +3956,6 @@ pinkie@^2.0.0:
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
   integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 
-pirates@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
-  integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
-  dependencies:
-    node-modules-regexp "^1.0.0"
-
 pkg-dir@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
@@ -6597,13 +3963,6 @@ pkg-dir@^2.0.0:
   dependencies:
     find-up "^2.1.0"
 
-pkg-dir@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
-  integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
-  dependencies:
-    find-up "^4.0.0"
-
 pkg-up@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
@@ -6656,16 +4015,6 @@ pretty-format@^22.4.3:
     ansi-regex "^3.0.0"
     ansi-styles "^3.2.0"
 
-pretty-format@^26.4.2:
-  version "26.4.2"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237"
-  integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==
-  dependencies:
-    "@jest/types" "^26.3.0"
-    ansi-regex "^5.0.0"
-    ansi-styles "^4.0.0"
-    react-is "^16.12.0"
-
 private@^0.1.6, private@^0.1.8:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -6686,14 +4035,6 @@ progress@^2.0.0:
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
   integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=
 
-prompts@^2.0.1:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068"
-  integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==
-  dependencies:
-    kleur "^3.0.3"
-    sisteransi "^1.0.4"
-
 prop-types@^15.6.2:
   version "15.7.2"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
@@ -6713,19 +4054,6 @@ pseudomap@^1.0.2:
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
   integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
 
-psl@^1.1.28:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
-  integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
-
-pump@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
-  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
 punycode@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
@@ -6736,12 +4064,7 @@ punycode@^2.1.0:
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
   integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
 
-punycode@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
-  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-qs@~6.5.1, qs@~6.5.2:
+qs@~6.5.1:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
@@ -6755,11 +4078,6 @@ randomatic@^3.0.0:
     kind-of "^6.0.0"
     math-random "^1.0.1"
 
-react-is@^16.12.0:
-  version "16.13.1"
-  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
-  integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-
 react-is@^16.8.1:
   version "16.8.6"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
@@ -6781,15 +4099,6 @@ read-pkg-up@^2.0.0:
     find-up "^2.0.0"
     read-pkg "^2.0.0"
 
-read-pkg-up@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
-  integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
-  dependencies:
-    find-up "^4.1.0"
-    read-pkg "^5.2.0"
-    type-fest "^0.8.1"
-
 read-pkg@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
@@ -6808,16 +4117,6 @@ read-pkg@^2.0.0:
     normalize-package-data "^2.3.2"
     path-type "^2.0.0"
 
-read-pkg@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
-  integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
-  dependencies:
-    "@types/normalize-package-data" "^2.4.0"
-    normalize-package-data "^2.5.0"
-    parse-json "^5.0.0"
-    type-fest "^0.6.0"
-
 readable-stream@^2.0.2:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
@@ -6844,23 +4143,11 @@ readable-stream@~2.1.5:
     string_decoder "~0.10.x"
     util-deprecate "~1.0.1"
 
-regenerate-unicode-properties@^8.2.0:
-  version "8.2.0"
-  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
-  integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
-  dependencies:
-    regenerate "^1.4.0"
-
 regenerate@^1.2.1:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
   integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==
 
-regenerate@^1.4.0:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"
-  integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
-
 regenerator-runtime@^0.10.5:
   version "0.10.5"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
@@ -6871,11 +4158,6 @@ regenerator-runtime@^0.11.0:
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
   integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
 
-regenerator-runtime@^0.13.4:
-  version "0.13.7"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
-  integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
-
 regenerator-transform@^0.10.0:
   version "0.10.1"
   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
@@ -6885,13 +4167,6 @@ regenerator-transform@^0.10.0:
     babel-types "^6.19.0"
     private "^0.1.6"
 
-regenerator-transform@^0.14.2:
-  version "0.14.5"
-  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
-  integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
-  dependencies:
-    "@babel/runtime" "^7.8.4"
-
 regex-cache@^0.4.2:
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
@@ -6921,28 +4196,11 @@ regexpu-core@^2.0.0:
     regjsgen "^0.2.0"
     regjsparser "^0.1.4"
 
-regexpu-core@^4.7.0:
-  version "4.7.1"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
-  integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
-  dependencies:
-    regenerate "^1.4.0"
-    regenerate-unicode-properties "^8.2.0"
-    regjsgen "^0.5.1"
-    regjsparser "^0.6.4"
-    unicode-match-property-ecmascript "^1.0.4"
-    unicode-match-property-value-ecmascript "^1.2.0"
-
 regjsgen@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
   integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
 
-regjsgen@^0.5.1:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
-  integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
-
 regjsparser@^0.1.4:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
@@ -6950,13 +4208,6 @@ regjsparser@^0.1.4:
   dependencies:
     jsesc "~0.5.0"
 
-regjsparser@^0.6.4:
-  version "0.6.4"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272"
-  integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==
-  dependencies:
-    jsesc "~0.5.0"
-
 remove-trailing-separator@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -6986,13 +4237,6 @@ request-promise-core@1.1.1:
   dependencies:
     lodash "^4.13.1"
 
-request-promise-core@1.1.4:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
-  integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==
-  dependencies:
-    lodash "^4.17.19"
-
 request-promise-native@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
@@ -7002,15 +4246,6 @@ request-promise-native@^1.0.5:
     stealthy-require "^1.1.0"
     tough-cookie ">=2.3.3"
 
-request-promise-native@^1.0.8:
-  version "1.0.9"
-  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28"
-  integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==
-  dependencies:
-    request-promise-core "1.1.4"
-    stealthy-require "^1.1.1"
-    tough-cookie "^2.3.3"
-
 request@^2.83.0:
   version "2.85.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
@@ -7039,32 +4274,6 @@ request@^2.83.0:
     tunnel-agent "^0.6.0"
     uuid "^3.1.0"
 
-request@^2.88.2:
-  version "2.88.2"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
-  integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
-  dependencies:
-    aws-sign2 "~0.7.0"
-    aws4 "^1.8.0"
-    caseless "~0.12.0"
-    combined-stream "~1.0.6"
-    extend "~3.0.2"
-    forever-agent "~0.6.1"
-    form-data "~2.3.2"
-    har-validator "~5.1.3"
-    http-signature "~1.2.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.19"
-    oauth-sign "~0.9.0"
-    performance-now "^2.1.0"
-    qs "~6.5.2"
-    safe-buffer "^5.1.2"
-    tough-cookie "~2.5.0"
-    tunnel-agent "^0.6.0"
-    uuid "^3.3.2"
-
 require-directory@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
@@ -7080,33 +4289,16 @@ require-main-filename@^1.0.1:
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
   integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
 
-require-main-filename@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
-  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-
 reselect@^3.0.0, reselect@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
   integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=
 
-resolve-cwd@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
-  integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
-  dependencies:
-    resolve-from "^5.0.0"
-
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
   integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 
-resolve-from@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
-  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
 resolve-url@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
@@ -7124,13 +4316,6 @@ resolve@^1.10.0, resolve@^1.8.1, resolve@^1.9.0:
   dependencies:
     path-parse "^1.0.6"
 
-resolve@^1.17.0, resolve@^1.3.2:
-  version "1.17.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
-  integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
-  dependencies:
-    path-parse "^1.0.6"
-
 resolve@^1.4.0, resolve@^1.5.0:
   version "1.7.1"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
@@ -7173,13 +4358,6 @@ rimraf@2.6.3:
   dependencies:
     glob "^7.1.3"
 
-rimraf@^3.0.0:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
-  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
-  dependencies:
-    glob "^7.1.3"
-
 rollup-plugin-babel@3:
   version "3.0.7"
   resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e"
@@ -7257,11 +4435,6 @@ rollup@^1.8.0:
     "@types/node" "^11.11.6"
     acorn "^6.1.1"
 
-rsvp@^4.8.4:
-  version "4.8.5"
-  resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
-  integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
-
 run-async@^2.2.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
@@ -7288,11 +4461,6 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
-safe-buffer@^5.1.2:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
-  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
 safe-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -7305,59 +4473,25 @@ safe-regex@^1.1.0:
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
-sane@^4.0.3:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
-  integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
-  dependencies:
-    "@cnakazawa/watch" "^1.0.3"
-    anymatch "^2.0.0"
-    capture-exit "^2.0.0"
-    exec-sh "^0.3.2"
-    execa "^1.0.0"
-    fb-watchman "^2.0.0"
-    micromatch "^3.1.4"
-    minimist "^1.1.1"
-    walker "~1.0.5"
-
 sax@^1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-saxes@^5.0.0:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
-  integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
-  dependencies:
-    xmlchars "^2.2.0"
-
 semver-compare@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
   integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
-  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+  integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
 
-semver@7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
-  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-
-semver@^6.0.0, semver@^6.3.0:
-  version "6.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
-  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@^7.3.2:
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
-  integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
-  dependencies:
-    lru-cache "^6.0.0"
+semver@^5.5.1:
+  version "5.7.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
+  integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
 
 set-blocking@^2.0.0:
   version "2.0.0"
@@ -7396,48 +4530,21 @@ shebang-command@^1.2.0:
   dependencies:
     shebang-regex "^1.0.0"
 
-shebang-command@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
-  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
-  dependencies:
-    shebang-regex "^3.0.0"
-
 shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
   integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
 
-shebang-regex@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
-  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-shellwords@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
-  integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
-
 signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
   integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
 
-sisteransi@^1.0.4:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
-  integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
-
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
   integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
 
-slash@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
-  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
 slice-ansi@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
@@ -7522,14 +4629,6 @@ source-map-support@^0.5.0:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map-support@^0.5.6:
-  version "0.5.19"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
-  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
-  dependencies:
-    buffer-from "^1.0.0"
-    source-map "^0.6.0"
-
 source-map-url@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
@@ -7540,16 +4639,11 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+source-map@^0.6.0, source-map@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
-source-map@^0.7.3:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
-  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
 sourcemap-codec@^1.4.4:
   version "1.4.6"
   resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9"
@@ -7613,13 +4707,6 @@ stack-utils@^1.0.1:
   resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
   integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=
 
-stack-utils@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593"
-  integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==
-  dependencies:
-    escape-string-regexp "^2.0.0"
-
 staged-git-files@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.1.tgz#37c2218ef0d6d26178b1310719309a16a59f8f7b"
@@ -7633,7 +4720,7 @@ static-extend@^0.1.1:
     define-property "^0.2.5"
     object-copy "^0.1.0"
 
-stealthy-require@^1.1.0, stealthy-require@^1.1.1:
+stealthy-require@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
   integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
@@ -7650,14 +4737,6 @@ string-argv@^0.0.2:
   resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736"
   integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY=
 
-string-length@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1"
-  integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==
-  dependencies:
-    char-regex "^1.0.2"
-    strip-ansi "^6.0.0"
-
 string-width@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -7684,31 +4763,6 @@ string-width@^3.0.0:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^5.1.0"
 
-string-width@^4.1.0, string-width@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
-  integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
-  dependencies:
-    emoji-regex "^8.0.0"
-    is-fullwidth-code-point "^3.0.0"
-    strip-ansi "^6.0.0"
-
-string.prototype.trimend@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
-  integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
-  dependencies:
-    define-properties "^1.1.3"
-    es-abstract "^1.17.5"
-
-string.prototype.trimstart@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
-  integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
-  dependencies:
-    define-properties "^1.1.3"
-    es-abstract "^1.17.5"
-
 string_decoder@~0.10.x:
   version "0.10.31"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@@ -7756,13 +4810,6 @@ strip-ansi@^5.1.0:
   dependencies:
     ansi-regex "^4.1.0"
 
-strip-ansi@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
-  integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
-  dependencies:
-    ansi-regex "^5.0.0"
-
 strip-bom@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -7775,21 +4822,11 @@ strip-bom@^3.0.0:
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
   integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 
-strip-bom@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
-  integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
-
 strip-eof@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
   integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
 
-strip-final-newline@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
-  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
 strip-indent@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
@@ -7812,21 +4849,6 @@ supports-color@^5.3.0:
   dependencies:
     has-flag "^3.0.0"
 
-supports-color@^7.0.0, supports-color@^7.1.0:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
-  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
-  dependencies:
-    has-flag "^4.0.0"
-
-supports-hyperlinks@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47"
-  integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==
-  dependencies:
-    has-flag "^4.0.0"
-    supports-color "^7.0.0"
-
 symbol-observable@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
@@ -7842,11 +4864,6 @@ symbol-tree@^3.2.2:
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
   integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=
 
-symbol-tree@^3.2.4:
-  version "3.2.4"
-  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
-  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-
 table@^4.0.2:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc"
@@ -7869,33 +4886,11 @@ table@^5.2.3:
     slice-ansi "^2.1.0"
     string-width "^3.0.0"
 
-terminal-link@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
-  integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
-  dependencies:
-    ansi-escapes "^4.2.1"
-    supports-hyperlinks "^2.0.0"
-
-test-exclude@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
-  integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
-  dependencies:
-    "@istanbuljs/schema" "^0.1.2"
-    glob "^7.1.4"
-    minimatch "^3.0.4"
-
 text-table@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
-throat@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
-  integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==
-
 through@^2.3.6, through@^2.3.8:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@@ -7913,11 +4908,6 @@ tmp@^0.0.33:
   dependencies:
     os-tmpdir "~1.0.2"
 
-tmpl@1.0.x:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
-  integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
-
 to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
@@ -7943,13 +4933,6 @@ to-regex-range@^2.1.0:
     is-number "^3.0.0"
     repeat-string "^1.6.1"
 
-to-regex-range@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
-  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
-  dependencies:
-    is-number "^7.0.0"
-
 to-regex@^3.0.1, to-regex@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
@@ -7967,23 +4950,6 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3:
   dependencies:
     punycode "^1.4.1"
 
-tough-cookie@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2"
-  integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==
-  dependencies:
-    ip-regex "^2.1.0"
-    psl "^1.1.28"
-    punycode "^2.1.1"
-
-tough-cookie@~2.5.0:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
-  integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
-  dependencies:
-    psl "^1.1.28"
-    punycode "^2.1.1"
-
 tr46@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
@@ -7991,13 +4957,6 @@ tr46@^1.0.1:
   dependencies:
     punycode "^2.1.0"
 
-tr46@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479"
-  integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==
-  dependencies:
-    punycode "^2.1.1"
-
 "traverse@>=0.3.0 <0.4":
   version "0.3.9"
   resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
@@ -8032,56 +4991,6 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
-type-detect@4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
-  integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
-
-type-fest@^0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
-  integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
-
-type-fest@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
-  integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
-
-type-fest@^0.8.1:
-  version "0.8.1"
-  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
-  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-
-typedarray-to-buffer@^3.1.5:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
-  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
-  dependencies:
-    is-typedarray "^1.0.0"
-
-unicode-canonical-property-names-ecmascript@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
-  integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
-
-unicode-match-property-ecmascript@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
-  integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
-  dependencies:
-    unicode-canonical-property-names-ecmascript "^1.0.4"
-    unicode-property-aliases-ecmascript "^1.0.4"
-
-unicode-match-property-value-ecmascript@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
-  integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
-
-unicode-property-aliases-ecmascript@^1.0.4:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
-  integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
-
 union-value@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
@@ -8168,24 +5077,15 @@ util-deprecate@~1.0.1:
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
-uuid@^3.1.0, uuid@^3.3.2:
+uuid@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+  integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
+
+uuid@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
 
-uuid@^8.3.0, uuid@^8.3.1:
-  version "8.3.2"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
-  integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-
-v8-to-istanbul@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz#0608f5b49a481458625edb058488607f25498ba5"
-  integrity sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==
-  dependencies:
-    "@types/istanbul-lib-coverage" "^2.0.1"
-    convert-source-map "^1.6.0"
-    source-map "^0.7.3"
-
 validate-npm-package-license@^3.0.1:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
@@ -8215,42 +5115,11 @@ w3c-hr-time@^1.0.1:
   dependencies:
     browser-process-hrtime "^0.1.2"
 
-w3c-hr-time@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
-  integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
-  dependencies:
-    browser-process-hrtime "^1.0.0"
-
-w3c-xmlserializer@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
-  integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
-  dependencies:
-    xml-name-validator "^3.0.0"
-
-walker@^1.0.7, walker@~1.0.5:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
-  integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
-  dependencies:
-    makeerror "1.0.x"
-
 webidl-conversions@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
   integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
 
-webidl-conversions@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
-  integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
-
-webidl-conversions@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
-  integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
-
 whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
@@ -8258,23 +5127,11 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
   dependencies:
     iconv-lite "0.4.19"
 
-whatwg-encoding@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
-  integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
-  dependencies:
-    iconv-lite "0.4.24"
-
 whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4"
   integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==
 
-whatwg-mimetype@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
-  integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
-
 whatwg-url@^6.4.0:
   version "6.4.1"
   resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67"
@@ -8284,25 +5141,11 @@ whatwg-url@^6.4.0:
     tr46 "^1.0.1"
     webidl-conversions "^4.0.2"
 
-whatwg-url@^8.0.0:
-  version "8.2.2"
-  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.2.2.tgz#85e7f9795108b53d554cec640b2e8aee2a0d4bfd"
-  integrity sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ==
-  dependencies:
-    lodash.sortby "^4.7.0"
-    tr46 "^2.0.2"
-    webidl-conversions "^6.1.0"
-
 which-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
   integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
 
-which-module@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
-  integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
-
 which@^1.2.10, which@^1.2.9, which@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
@@ -8310,13 +5153,6 @@ which@^1.2.10, which@^1.2.9, which@^1.3.0:
   dependencies:
     isexe "^2.0.0"
 
-which@^2.0.1, which@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
-  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
-  dependencies:
-    isexe "^2.0.0"
-
 window-size@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
@@ -8335,30 +5171,11 @@ wrap-ansi@^2.0.0:
     string-width "^1.0.1"
     strip-ansi "^3.0.1"
 
-wrap-ansi@^6.2.0:
-  version "6.2.0"
-  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
-  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
-  dependencies:
-    ansi-styles "^4.0.0"
-    string-width "^4.1.0"
-    strip-ansi "^6.0.0"
-
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write-file-atomic@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
-  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
-  dependencies:
-    imurmurhash "^0.1.4"
-    is-typedarray "^1.0.0"
-    signal-exit "^3.0.2"
-    typedarray-to-buffer "^3.1.5"
-
 write@1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
@@ -8374,49 +5191,21 @@ ws@^4.0.0:
     async-limiter "~1.0.0"
     safe-buffer "~5.1.0"
 
-ws@^7.2.3:
-  version "7.3.1"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
-  integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
-
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
-xmlchars@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
-  integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
-
 y18n@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
   integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
 
-y18n@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
-  integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
-
 yallist@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
   integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
 
-yallist@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
-  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yargs-parser@^18.1.2:
-  version "18.1.3"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
-  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
-  dependencies:
-    camelcase "^5.0.0"
-    decamelize "^1.2.0"
-
 yargs-parser@^2.4.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
@@ -8425,23 +5214,6 @@ yargs-parser@^2.4.1:
     camelcase "^3.0.0"
     lodash.assign "^4.0.6"
 
-yargs@^15.3.1:
-  version "15.4.1"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
-  integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
-  dependencies:
-    cliui "^6.0.0"
-    decamelize "^1.2.0"
-    find-up "^4.1.0"
-    get-caller-file "^2.0.1"
-    require-directory "^2.1.1"
-    require-main-filename "^2.0.0"
-    set-blocking "^2.0.0"
-    string-width "^4.2.0"
-    which-module "^2.0.0"
-    y18n "^4.0.0"
-    yargs-parser "^18.1.2"
-
 yargs@^4.2.0:
   version "4.8.1"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"